原創文檔編寫不易,未經許可請勿轉載。文檔中有疑問的可以郵件聯繫我。 郵箱:[email protected] 文章基於CentOS 7.8系統使用Containerdr作為容器運行時通過kubeadm指導搭建k8s單機master集群,使用calico作為k8s集群的網路插件。K8S官方在1.24版本 ...
原創文檔編寫不易,未經許可請勿轉載。文檔中有疑問的可以郵件聯繫我。 郵箱:[email protected]
文章基於CentOS 7.8系統使用Containerdr作為容器運行時通過kubeadm指導搭建k8s單機master集群,使用calico作為k8s集群的網路插件。K8S官方在1.24版本徹底棄用docker。
需要伺服器可以聯網。
環境
節點說明
主機名 | IP地址 | 操作系統 |
c_master01.lvan | 192.168.100.200 | CentOS Linux release 7.8 |
c_node01.lvan | 192.168.100.201 | CentOS Linux release 7.8 |
c_node02.lvan | 192.168.100.202 | CentOS Linux release 7.8 |
軟體環境
軟體名 | 軟體版本 | 作用 |
CentOS Linux release | 7.8 | 操作系統 |
containerd.io | 1.6.14-3.1 | 容器運行時 |
cri-tools | 1.25.0-0 | containerd客戶端 |
nerdctl | 1.1.0 | containerd客戶端 |
cni-plugins | v1.1.1 | cni插件 |
metrics-server | v0.6.2 | k8s集群性能監控插件 |
kubectl | 1.26.0-0 | k8s控制工具 |
kubeadm | 1.26.0-0 | k8s服務端 |
kubelet | 1.26.0-0 | k8s客戶端 |
calico | v3.24.5 | K8S網路插件 |
pause | 3.7 | 編車容器 |
ip地址規劃
ip地址 | 作用 |
192.168.100.200 | k8s主節點 |
192.168.100.201 | k8s子節點1 |
192.168.100.202 | k8s子節點2 |
10.244.0.0/16 | Pod網段地址 |
表 2 ip地址規劃
步驟預覽
- 操作系統配置:配置IP地址、配置主機名、關閉防火牆、關閉selinux、關閉swap、修改/etc/hosts文件、配置yum源
- 安裝配置docker
- 修改系統內核參數
- 安裝kubelet軟體
- 初始化K8S集群
- 子節點加入k8s集群
- 安裝網路插件
- 安裝metrics-server監控集群性能數據
操作過程
一、操作系統配置
該章節的所有操作所有節點上均要執行。
設置主機名
按照規劃文件中的名稱依次設置每個節點的主機名。
# hostnamectl set-hostname 規劃的主機名
IP地址配置
按照規劃文件中的IP地址依次配置每個節點的IP地址。
# systemctl stop NetworkManager;systemctl disabled NetworkManager;systemctl mask NetworkManager # cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-修改為你的網卡名 TYPE=Ethernet BOOTPROTO=none NAME=修改為你的網卡名 DEVICE=修改為你的網卡名 ONBOOT=yes IPADDR=修改為你需要設置的ip地址 NETMASK=255.255.255.0 GATEWAY=修改為你需要設置的ip地址網關 DNS1=修改為你需要設置的ip地址DNS EOF # systemctl restart network # ip a
關閉selinux
在/etc/selinux/config中設置SELINUX=為disabled
# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config # setenforce 0
關閉swap
在/etc/fstab文件中刪除swap的掛載信息行,系統中執行swaoff -a臨時關閉swap。
# swapoff -a # sed -i '/swap/d' /etc/fstab
關閉防火牆
關閉防火牆,並設置防火牆為開機不啟動
# systemctl stop firewalld;systemctl disable firewalld;systemctl mask firewalld
# systemctl status firewalld
設置/etc/hosts文件
在/etc/hosts文件中添加所有節點的信息。
# cat >> /etc/hosts <<EOF 192.168.100.200 cmaster01.lvan master01 192.168.100.201 cnode01.lvan node01 192.168.100.202 cnode02.lvan node02 EOF
配置yum源
備份當前的yun配置文件,並創建新的yum源文件。
# mkdir -p /etc/yum.repos.d/bak/ # mv /etc/yum.repos.d/CentOS* /etc/yum.repos.d/bak/ # 在/etc/yum.repos.d/目錄中創建k8s.repo、epel.repo、docker.repo、CentOS-Base.repo 四個repo源文件,具體內容如下所示。 # yum clean all # yum repolist
k8s.repo
[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgView Code
epel.repo
[epel] name=Extra Packages for Enterprise Linux 7 – $basearch baseurl=http://mirrors.aliyun.com/epel/7/$basearch #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch failovermethod=priority enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7View Code
docker.repo
[docker-ce-stable] name=Docker CE Stable – $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpgView Code
CentOS-Base.repo
[base] name=CentOS-$releasever – Base – mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #released updates [updates] name=CentOS-$releasever – Updates – mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #additional packages that may be useful [extras] name=CentOS-$releasever – Extras – mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7View Code
安裝常用工具
安裝vim、net-tools、bash-completion、wget常用的工具軟體。
# yum install vim net-tools bash-completion wget -y # source /etc/profile.d/bash_completion.sh # echo 'set paste' >> ~/.vimrc
二、安裝配置containerd
該章節的所有操作所有節點上均要執行。
安裝containerd
# yum install containerd.io-1.6.14 cri-tools -y # crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock # systemctl restart containerd ; systemctl enable containerd
設置containerd鏡像加速
containerd 運行時配置加速:在[plugins.”io.containerd.grpc.v1.cri”.registry.mirrors]行下添加內容:[plugins.”io.containerd.grpc.v1.cri”.registry.mirrors.”docker.io”] 換行再添加 endpoint = [“https://frz7i079.mirror.aliyuncs.com”]。藍色字體及為需要添加的內容。
# containerd config default > /etc/containerd/config.toml # vim /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://sdmy9bft.mirror.aliyuncs.com"]
設置cgroup驅動及sandbox_image地址
在/etc/containerd/config.toml文件修改runc.options選項SystemdCgroup = true。設置sandbox_image鏡像下載地址為阿裡雲的地址。
# sed -i 's/SystemdCgroup.*/SystemdCgroup\ =\ true/g' /etc/containerd/config.toml # sed -i 's#sandbox_image.*#sandbox_image\ =\ \"registry.aliyuncs.com/google_containers/pause:3.7\"#g' /etc/containerd/config.toml # systemctl restart containerd
三、安裝容器工具
該章節的所有操作所有節點上均要執行。
安裝cni插件
在網址:https://github.com/containernetworking/plugins/releases/ 中下載軟體包。
# wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz # mkdir -p /opt/cni/bin/ # tar -zxf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/
安裝nerdctl工具
nerdctl工具是操作containerd的客戶端,可以實現操作containerd和docker一樣命令集操作。
在網址:https://github.com/containerd/nerdctl/releases 中下載軟體包只需下載精簡包即可(不帶full字樣的)。
# wget https://github.com/containerd/nerdctl/releases/download/v1.1.0/nerdctl-1.1.0-linux-amd64.tar.gz # tar -zxvf nerdctl-1.1.0-linux-amd64.tar.gz # mv nerdctl /bin/ # echo 'source <(nerdctl completion bash)' >> /etc/profile # echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/profile # source /etc/profile # nerdctl images
四、修改系統內核配置
該章節的所有操作所有節點上均要執行。
設置系統允許轉發,載入k8s所需的內核模塊。
# cat > /etc/modules-load.d/containerd.conf <<EOF overlay br_netfilter EOF # modprobe overlay # modprobe br_netfilter # cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF # sysctl -p /etc/sysctl.d/k8s.conf
五、安裝kubelet軟體
該章節的所有操作所有節點上均要執行。
# yum install -y kubelet-1.26.0-0 kubeadm-1.26.0-0 kubectl-1.26.0-0 --disableexcludes=kubernetes # systemctl restart kubelet ; systemctl enable kubelet
六、初始化K8S集群
初始化k8s環境
該操作只在master節點上執行。命令執行完成過後記錄下結果。
# kubeadm init --apiserver-advertise-address=192.168.100.200 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.26.0 --pod-network-cidr=10.244.0.0/16
環境初始完成過後根據提示執行命令
# mkdir -p $HOME/.kube # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # sudo chown $(id -u):$(id -g) $HOME/.kube/config # kubectl get nodes
命令執行完成過後會有如下輸出,最好複製出來保存。
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.100.200:6443 --token lskbcb.y1d3ch2a2in75y8x \ --discovery-token-ca-cert-hash sha256:0894894ba4f405f44499b71002c762bebfd9533be6a7d17fc6d56d77db645f84
配置kubectl命令自動補齊
該操作所有節點上均要執行。
# echo 'source <(kubectl completion bash)' >> /etc/profile # source /etc/profile
六、子節點加入k8s集群
獲取加入集群的命令
該操作只在master節點上執行。
master節點環境初始化過後會自動生成一個命令。使用這個命令直接複製到子節點上實現子節點加入集群。
如果忘記了使用命令如下獲取。
# kubeadm token create --print-join-command
加入集群
該操作只在子節點上執行。
通過之前記錄的命令或者上一步獲取的命令,在子節點中複製執行。
# kubeadm join 192.168.100.200:6443 --token q6qmz0.wq7l7iavpqr6rd5b --discovery-token-ca-cert-hash sha256:0894894ba4f405f44499b71002c762bebfd9533be6a7d17fc6d56d77db645f84
七、安裝網路插件calico
該章節操作只在master節點上執行。
下載calico配置文件
執行wget命令下載calico的yaml文件。
# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
修改calico配置文件
把calico.yaml文件中的CALICO_IPV4POOL_CIDR行和其下一行前的#刪除掉,並CALICO_IPV4POOL_CIDR其下行的IP地址段改為規劃文件中的網段。併在calico.yaml文件中增加藍色字體內容,指定ens33為通信網卡(多網卡環境中必須要使用,請根據自己實際情況選擇正確的網卡),格式要和CALICO_IPV4POOL_CIDR對齊。
# vim calico.yaml - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" - name: IP_AUTODETECTION_METHOD value: "interface=ens33"
下載caclio所需鏡像(可選)
該操作只在master節點上執行。
手動下載calico所需鏡像並上傳到所有節點中,執行了kubectl apply -f calico.yaml命令後系統會自東下載,但是會有點慢。我們可以提前下載好傳到所有節點中。
# grep image calico.yaml | grep -i calico | awk -F'/' '{print $2"/"$3 }' | uniq # docker pull calico/cni:v3.24.5 # docker pull calico/node:v3.24.5 # docker pull calico/kube-controllers:v3.24.5 # docker save -o calico_image_3_24_5.tar.gz calico/cni:v3.24.5 calico/node:v3.24.5 calico/kube-controllers:v3.24.5 # scp calico_image_3_24_5.tar.gz root@node01:/root/ # scp calico_image_3_24_5.tar.gz root@node02:/root/
該操作所有節點上均要執行。
載入docker鏡像到系統中。
# docker load -i /root/calico_image_3_24_5.tar.gz
安裝calico插件
# kubectl apply -f calico.yaml # kubectl get nodes -o wide -A # kubectl get pod -o wide -A
圖 1-1 最終結果
八、安裝metrics-server
metrics-server可用於k8s集群資源使用監控。
訪問網址:https://github.com/kubernetes-sigs/metrics-server 在頁面中下拉找到 Installation 章節,找到如下的信息: kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml ,截取藍色高亮部分內容,在Master節點上執行命令下載conponents.yaml文件。
下載metrics-server軟體
# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml # #查看components.yaml所需要鏡像及版本,提前下載 # grep image components.yaml image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2 imagePullPolicy: IfNotPresent # #該k8s.gcr.io/metrics-server/metrics-server:v0.6.2鏡像由於不可描述的原因下載起來有點麻煩。在https://hub.docker.com/中去下載。 # nerdctl pull k8simage/metrics-server:v0.6.2 # nerdctl tag k8simage/metrics-server:v0.6.2 k8s.gcr.io/metrics-server/metrics-server:v0.6.2 # #把metrics-server鏡像打包並複製到所有節點上去。 # nerdctl save -o metrics-server.tar.gz k8s.gcr.io/metrics-server/metrics-server:v0.6.2 # scp metrics-server.tar.gz [email protected]:/root/ # #在其他節點上讀取載入metrics-server鏡像包。 # nerdctl load -i metrics-server.tar.gz # #確認鏡像包導入正常。 # nerdctl images
修改metrics-server.yaml文件
在下載metrics-server的配置文件中修改添加藍色字體內容。
# sed -i -e 's/kubelet-preferred-address-types.*/kubelet-preferred-address-types=InternalIP/g' -e 's/metric-resolution.*/metric-resolution=30s/g' -e '/metric-resolution/a\ - --kubelet-insecure-tls' components.yaml
創建metrics-server pod
執行命令創建pod,並確認metrics-server pod運行正常,可以正常獲取到k8s資源性能數據。
# kubectl apply -f components.yaml # kubectl get pods -A # kubectl top nodes