參考文獻(xiàn)
K8S基礎(chǔ)知識(shí)與集群搭建
kubeadm搭建單master多node的k8s集群—主要參考這個(gè)博客,但是有坑,故貼出我自己的過程,坑會(huì)少很多
注意:
- 集群配置是:一臺(tái)master:zabbixagent-k8smaster,兩臺(tái)node:k8snode1和k8snode2
- 當(dāng)沒有明說master機(jī)器做什么或者node機(jī)器做什么時(shí),所有操作步驟默認(rèn)是三臺(tái)機(jī)器都要進(jìn)行配置
- 操作系統(tǒng):centos 7,且master的cpu要配置2核及以上,否則跑不動(dòng)k8s?。?!
1.環(huán)境準(zhǔn)備
a.修改機(jī)器的ip地址并設(shè)置為靜態(tài)ip
- vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b841150d-bab6-4e52-802d-83c990f6b00f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.50
NETMASK=255.255.255.0
GATEWAY=192.168.0.2
DNS1=192.168.0.2
上述代碼中主要設(shè)置:
BOOTPROTO=static
IPADDR=your ip
NETMASK=your netmask
GATEWAY=your gateway
DNS1=your dns
- 修改后重啟生效:systemctl restart network
b.修改主機(jī)名
- 修改主機(jī)名:hostnamectl set-hostname yournmae && bash
- master IP:192.168.0.51
- Node1 IP:192.168.0.52
- Node2 IP:192.168.0.53
c.關(guān)閉selinux和關(guān)閉防火墻
- 關(guān)閉selinux:
- sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
- 重啟以生效:reboot
- 使用getenforce查看selinux的狀態(tài)
- 關(guān)閉防火墻
- systemctl stop firewalld && systemctl disable firewalld
d.修改hosts?件
- 目的:讓各個(gè)節(jié)點(diǎn)都能夠通過主機(jī)名訪問到其他節(jié)點(diǎn)。修改每個(gè)機(jī)器的/etc/hosts?件
- 每臺(tái)機(jī)器執(zhí)行以下命令:
echo '192.168.0.51 zabbixagent-k8smaster
192.168.0.52 k8snode1
192.168.0.53 k8snode2' >> /etc/hosts
其中ip地址及對(duì)應(yīng)的主機(jī)名改為你自己對(duì)應(yīng)的。
- 查看修改后的hosts文件
e.機(jī)器上配置 yum 源
- 刪除原有的yum源:rm -rf /etc/yum.repos.d/*.repo
- 下載centos7的reposity(因?yàn)槲业牟僮飨到y(tǒng)是centos):wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo (如果沒有wget,去 http://mirrors.aliyun.com/repo/ 下載CentOS-Base.repo,再上傳CentOS-Base.repo文件到/etc/yum.repos.d/目錄下)
- 清楚緩存:yum clean all && yum makecache
- 安裝lrzsz、scp、vim、wget、net-tools:yum install -y lrzsz scp vim wget net-tools yum-utils
f.配置國(guó)內(nèi) docker 的 repo、epel 源
- 下載repo:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 下載epel源:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
- 查看文件:ls /etc/yum.repos.d/
g.配置主機(jī)間免密登錄-命令按先后步驟執(zhí)行(注意看本節(jié)每個(gè)字)
- 目的:每臺(tái)機(jī)器設(shè)置免密登錄,因?yàn)閗8s集群中的各個(gè)節(jié)點(diǎn)之間需要通過 ssh 進(jìn)行通信
- 生成密鑰:ssh-keygen(一路回車)–注意:下方圖片橫線處,如果沒有生成這個(gè)或者接下來的步驟執(zhí)行不成功,再次執(zhí)行“ssh-keygen”命令
- 將本地生成的密鑰文件和私鑰文件拷貝到zabbixagent-k8smaster節(jié)點(diǎn)(此處是你自己的節(jié)點(diǎn)名字):ssh-copy-id zabbixagent-k8smaster --注意:下方圖片橫線處,需要輸入zabbixagent-k8smaster的密碼。
- 將本地生成的密鑰文件和私鑰文件拷貝到k8snode1節(jié)點(diǎn)(此處是你自己的的節(jié)點(diǎn)):ssh-copy-id k8snode1 --注意:下方圖片橫線處,需要輸入k8snode1的密碼。
- 將本地生成的密鑰文件和私鑰文件拷貝到k8snode2節(jié)點(diǎn)(此處是你自己的節(jié)點(diǎn)):ssh-copy-id k8snode2 --注意:下方圖片橫線處,需要輸入k8snode2的密碼。
- 上面是在zabbixagent-k8smaster執(zhí)行了“ssh-keygen、ssh-copy-id zabbixagent-k8smaster、ssh-copy-id k8snode1、ssh-copy-id k8snode2”,,這些命令還需要在k8snode1和k8snode2執(zhí)行一遍
h.關(guān)閉 swap 分區(qū)
- 目的:swap交換分區(qū),在機(jī)器內(nèi)存不夠時(shí)會(huì)使用,但是swap分區(qū)的性能較低,k8s設(shè)計(jì)時(shí)為了提升性能,默認(rèn)不允許使用交換分區(qū)。kubeadm初始化的時(shí)候會(huì)檢查是否開啟了swap分區(qū),如果開啟了,會(huì)報(bào)錯(cuò),所以需要關(guān)閉swap分區(qū)。如果不想關(guān)閉交換分區(qū),可以使用–ignore-preflight-errors=Swap參數(shù)忽略檢查。
- 在master節(jié)點(diǎn)上:vim /etc/fstab,然后注釋掉/dev/mapper…
- 在兩個(gè)節(jié)點(diǎn)是上:vim /etc/fstab,需要注釋掉/dev/…和uuid
i.修改機(jī)器內(nèi)核參數(shù)
- 目的:k8s需要修改機(jī)器內(nèi)核參數(shù),使其支持路由轉(zhuǎn)發(fā)和橋接,否則會(huì)報(bào)錯(cuò)
- 三臺(tái)機(jī)器分別執(zhí)?修改內(nèi)核參數(shù)
- vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- modprobe br_netfilter
- sysctl -p /etc/sysctl.d/k8s.conf
j.配置安裝k8s組件的yum源
- vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
k.配置時(shí)間同步
- 目的:使ntpdate同步時(shí)間
- 安裝ntpdate:yum install -y ntpdate
- 與ntp服務(wù)器同步時(shí)間:ntpdate cn.pool.ntp.org
- 將時(shí)間同步命令寫?:crontab -e
0 2 * * * /usr/sbin/ntpdate cn.pool.ntp.org
- 重啟crontab服務(wù):systemctl restart crond
m.開啟 ipvs
- ipvs(IP Vertual Server):實(shí)現(xiàn)了傳輸層的負(fù)載均衡,是一種高性能、可擴(kuò)展的負(fù)載均衡方案。
- Linux內(nèi)核的一部分,承擔(dān)著負(fù)載均衡的功能。
- 通過ipvsadm工具來配置ipvs。
- ipvs可基于TCP和UDP的服務(wù)請(qǐng)求轉(zhuǎn)發(fā)到真實(shí)服務(wù)器上
- ipvs和iptables的區(qū)別:
- ipvs是在傳輸層工作,iptables是在網(wǎng)絡(luò)層工作。
- ipvs是基于內(nèi)容的負(fù)載均衡,iptables是基于地址的負(fù)載均衡。
- ipvs為大型集群提供了高性能的負(fù)載均衡,iptables為小型集群提供了負(fù)載均衡。
- ipvs支持更多的負(fù)載均衡算法,iptables只支持輪詢算法。
- ipvs支持服務(wù)器健康檢查、連接重試等功能,iptables不支持。
- 準(zhǔn)備ipvs.modules?件:vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ 0 -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
- 修改ipvs.modules文件權(quán)限并執(zhí)行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
n.安裝基礎(chǔ)軟件包
yum install -y device-mapper-persistent-data lvm2 net-tools conntrack-tools wget nfs-utils telnet gcc gcc-c++ make cmake libxml2-devel openssl-devel curl-devel unzip sudo ntp libaio-devel ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet
o.安裝 iptables
- iptables是Linux系統(tǒng)上常用的防火墻軟件,用于設(shè)置、審計(jì)和檢查IPv4和IPv6數(shù)據(jù)包過濾規(guī)則以及NAT表的工具。
- 安裝iptables:yum install -y iptables-services
- 禁?iptables:systemctl stop iptables && systemctl disable iptables
- 清空防?墻規(guī)則:iptables -F
p.安裝docker
- 安裝docker-ce和containerd:yum install -y docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io
- 啟動(dòng)docker:systemctl enable docker && systemctl start docker
q.配置docker鏡像加速器
- 創(chuàng)建配置?件:mkdir -p /etc/docker
- 創(chuàng)建daemon.json?件:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://rsbud4vc.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
- 加載配置、重啟docker:systemctl daemon-reload && systemctl restart docker
2.kubernetes集群部署
a.安裝初始化Kubernetes需要軟件包
- kubeadm: 用于初始化集群的指令;kubelet: 運(yùn)行在集群所有節(jié)點(diǎn)上,負(fù)責(zé)啟動(dòng) Pod 和容器等;kubectl: 用于與集群通信的命令行工具
- 安裝kubeadm、kubelet、kubectl
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 --nogpgcheck
- 開機(jī)啟動(dòng)kubelet:systemctl enable kubelet
- 下載k8s所需要的鏡像,并load到docker
- k8simage-1-20-6.tar.gz下載鏈接:https://pan.baidu.com/s/1K4n61u8yM3sUciiQoKlMPg 提取碼:wjq9
- docker load -i k8simage-1-20-6.tar.gz
b.使?kubeadm初始化k8s集群
- 只在主節(jié)點(diǎn)(master)上執(zhí)行此命。 注意:apiserver-advertise-address=your master IP
kubeadm init --kubernetes-version=v1.20.6 \
--apiserver-advertise-address=192.168.0.51 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16 \
--ignore-preflight-errors=SystemVerification
上面命令行的含義:
--kubernetes-version 指定k8s版本
--apiserver-advertise-address 指定apiserver的地址
--image-repository 指定鏡像倉(cāng)庫(kù)地址
--pod-network-cidr 指定pod網(wǎng)絡(luò)地址
--ignore-preflight-errors 忽略檢查
c.配置kubectl的配置文件config
- 目的:操作相當(dāng)于對(duì) kubectl 命令行工具進(jìn)行初始化,使其能夠與 Kubernetes 集群通信
- 只在主節(jié)點(diǎn)上執(zhí)行下方命令
mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看集群狀態(tài):kubectl get nodes(由于還沒有安裝網(wǎng)絡(luò)插件,所以下圖狀態(tài)是NotReady)
- 只在主節(jié)點(diǎn)上生成配置文件并修改:kubeadm config print init-defaults > a.yaml
- 修改a.yaml:vim a.yaml(下方代碼片中name: zabbixagent-k8smaster這處需要改為自己的master的名稱,然后就可以全部復(fù)制粘貼,將a.yaml替換)
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.104.26.192
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: zabbixagent-k8smaster
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.20.6
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
- 在三臺(tái)機(jī)器上都執(zhí)行,修改containerd配置?件:
- containerd config default > /etc/containerd/config.toml
- vi /etc/containerd/config.toml
# 添加下?內(nèi)容
SystemdCgroup = true
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"
- 三臺(tái)機(jī)器重啟運(yùn)行時(shí):systemctl restart containerd
- 在主節(jié)點(diǎn)上,重新初始化主節(jié)點(diǎn):kubeadm init --config a.yaml(如果此步驟報(bào)錯(cuò),可能的情況之一是:a.yaml中兩個(gè)apiVersion:應(yīng)該改為kubeadm.k8s.io/v1beta2)
- mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown ( i d ? u ) : (id -u): (id?u):(id -g) $HOME/.kube/config
d.擴(kuò)容k8s集群-添加node節(jié)點(diǎn)
- 目的:將另外兩臺(tái)節(jié)點(diǎn)加入到集群中
- 兩臺(tái)node機(jī)器分別執(zhí)行:
- systemctl restart containerd
- 然后在主節(jié)點(diǎn)執(zhí)行:kubeadm token create --print-join-command(這一步是獲取node節(jié)點(diǎn)加入master所需的token等信息。)
- 主節(jié)點(diǎn)打印出來的東西,復(fù)制到兩個(gè)node上執(zhí)行,看下面這張圖
- 在master上查看集群信息:kubectl get nodes
解釋:
1.ROLES為<none>,說明這個(gè)節(jié)點(diǎn)時(shí)工作節(jié)點(diǎn)
2. STATUS為NotReady,說明這個(gè)節(jié)點(diǎn)還沒有安裝網(wǎng)絡(luò)插件
- 主節(jié)點(diǎn)上執(zhí)行。將兩個(gè)節(jié)點(diǎn)的roles設(shè)置為workers:
- kubectl label node k8snode1 node-role.kubernetes.io/worker=worker
- kubectl label node k8snode2 node-role.kubernetes.io/worker=worker
文章來源:http://www.zghlxwxcb.cn/news/detail-826579.html
3.布置?絡(luò)插件
a.安裝?絡(luò)插件
- 去https://github.com/hqs2212586/docker-study/blob/main/calico.yaml下載calico.yaml,然后上傳到master節(jié)點(diǎn)
- master上執(zhí)行,使用yaml文件安裝calico.yaml:kubectl apply -f calico.yaml
- master執(zhí)行,查看節(jié)點(diǎn)狀態(tài):kubectl get nodes
b.測(cè)試在k8s創(chuàng)建pod是否可以正常訪問網(wǎng)絡(luò)
- 在兩臺(tái)node節(jié)點(diǎn)拉取busybox:1.28鏡像:docker pull busybox:1.28
![[image-20231211185738265.png]] - 在主節(jié)點(diǎn)創(chuàng)建 pod:kubectl run busybox --image=busybox:1.28 --restart=Never --rm -it busybox – sh(當(dāng)出現(xiàn)/ #時(shí)ping一個(gè)網(wǎng)址,能ping通說明網(wǎng)絡(luò)是通的)
c.測(cè)試k8s集群部署tomcat服務(wù)
- 在兩個(gè)node節(jié)點(diǎn) pull tomcat:docker pull tomcat:8.5-jre8-alpine
- 在 master節(jié)點(diǎn)創(chuàng)建tomcat.yaml:vim tomcat.yml
apiVersion: v1 #pod屬于k8s核心組v1
kind: Pod #創(chuàng)建的是一個(gè)Pod資源
metadata: #元數(shù)據(jù)
name: demo-pod #pod名字
namespace: default #pod所屬的名稱空間
labels:
app: myapp #pod具有的標(biāo)簽
env: dev #pod具有的標(biāo)簽
spec:
containers: #定義一個(gè)容器,容器是對(duì)象列表,下面可以有多個(gè)name
- name: tomcat-pod-java #容器的名字
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine #容器使用的鏡像
imagePullPolicy: IfNotPresent
- 在 master節(jié)點(diǎn)創(chuàng)建pod:kubectl apply -f tomcat.yaml
- 在 master節(jié)點(diǎn)創(chuàng)建tomcat-service.yml:vim tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30080
selector:
app: myapp
env: dev
- 在 master節(jié)點(diǎn)創(chuàng)建pod:kubectl apply -f tomcat-service.yaml
- 查看服務(wù)狀態(tài):kubectl get svc
文章來源地址http://www.zghlxwxcb.cn/news/detail-826579.html
- 訪問三臺(tái)機(jī)器ip加30080,看到Tomcat初始界面
到了這里,關(guān)于kubeadm搭建單master多node的k8s集群--小白文,圖文教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!