CentOS安裝k8s

2023-07-01 18:01:35

1.系統設定

  • 硬體設定基本要求
資源 大小
硬碟 >= 20G
cpu >= 2核
記憶體 >= 2G
  • 本教學設定
主機名 IP 設定
master 192.168.10.155 3核+2G+20G
worker1 192.168.10.234 3核+2G+20G
worker2 192.168.10.147 3核+2G+20G

2.安裝必要軟體

所有機器都要執行

yum 更新

sudo yum update -y
  • bash-completion: tab命令補全
  • wget:下載工具
  • vim-enhanced:vim編輯器
  • net-tools:網路工具
  • gcc: 編譯器
sudo yum install -y bash-completion wget vim-enhanced net-tools gcc

3.設定主機名

  • 檢視主機名
hostname
  • 設定主機名

以下三條命令分別在三個節點執行

#master節點
hostnamectl set-hostname k8s-master
#worker1節點
hostnamectl set-hostname k8s-worker1
#woker2節點
hostnamectl set-hostname k8s-worker2

4.設定hosts檔案

將節點加入到 hosts 檔案中

編輯/etc/hosts檔案

vi /etc/hosts

新增以下內容

192.168.10.155 k8s-master
192.168.10.234 k8s-worker1
192.168.10.147 k8s-worker2

5.設定時間同步

sudo yum -y install ntpdate
sudo ntpdate ntp1.aliyun.com
sudo systemctl status ntpdate
sudo systemctl start ntpdate
sudo systemctl status ntpdate
sudo systemctl enable ntpdate

6.關閉防火牆或者開通指定埠

這裡使用關閉防火牆

sudo systemctl stop firewalld.service 
sudo systemctl disable firewalld.service

7.關閉 swap 交換空間

#檢視
free -h
#臨時關閉swap
sudo swapoff -a
#久關閉swap分割區
sudo sed -i 's/.*swap.*/#&/' /etc/fstab

8.關閉selinux

#檢視
getenforce
cat /etc/selinux/config
#臨時關閉
sudo setenforce 0
#永久關閉
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

9. 安裝 docker, Containerd

  • 安裝 docker, Containerd
# 刪除 docker(如果有的話)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安裝必備工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 加入 docker 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

# 安裝 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安裝 containerd
sudo yum install -y containerd
  • 設定
# 停止 containerd
sudo systemctl stop containerd.service

# 生成並修改組態檔
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
sudo containerd config default > $HOME/config.toml
sudo cp $HOME/config.toml /etc/containerd/config.toml

sudo sed -i "s#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml

sudo sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml

# 將 containerd 加入開機自啟
sudo systemctl enable --now containerd.service

# 啟動 docker
sudo systemctl start docker.service
# 將 docker 加入開機自啟
sudo systemctl enable docker.service
sudo systemctl enable docker.socket
sudo systemctl list-unit-files | grep docker

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info

sudo systemctl status docker.service
sudo systemctl status containerd.service

10.新增阿里雲 k8s 映象倉庫

新增/etc/yum.repos.d/kubernetes.repo檔案;檔案內容如下

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
# 是否開啟本倉庫
enabled=1
# 是否檢查 gpg 簽名檔案
gpgcheck=0
# 是否檢查 gpg 簽名檔案
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

11.設定 docker 映象加速

sudo mkdir -p /etc/docker
vi /etc/docker/daemon.json

/etc/docker/daemon.json檔案新增如下內容

{
  "registry-mirrors":  [
        "https://dockerproxy.com",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
    ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

12. 將橋接的IPv4流量傳遞到iptables的鏈

cat >/etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter

cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF

sysctl --system

# 通過執行以下指令確認br_netfilter和overlay模組被載入
lsmod | egrep 'overlay|br_netfilter'
# 通過執行以下指令確認net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables系統變數在你的sysctl設定中被設定為1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

13.安裝k8s

# 安裝 1.27.1 版本
sudo yum install -y kubelet-1.27.1-0 kubeadm-1.27.1-0 kubectl-1.27.1-0 --disableexcludes=kubernetes --nogpgcheck

systemctl daemon-reload
sudo systemctl restart kubelet
sudo systemctl enable kubelet

安裝最新版本(生產環境不建議)

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --nogpgcheck

14.k8s設定

  • master 初始化(僅在master節點主機上執行)
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.42.150 --kubernetes-version=v1.27.1

--image-repository: 映象加速地址,一般不動

--apiserver-advertise-address: master節點IP地址

--kubernetes-version: kubernetes版本,自己選擇的什麼版本就改成什麼版本

初始化失敗可以使用kubeadm reset重置;失敗原因多半是因為網路問題,可以換個網路試試

  • 初始化成功後執行(僅在master節點主機上執行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 將 node 加入叢集(僅在node節點主句執行)

kubeadm init命令執行成功後,會列印以下內容 (不要直接複製,每個人不一樣)

kubeadm join 192.168.10.155:6443 --token pn5997.vkugw8cmdpc407y2 \
	--discovery-token-ca-cert-hash sha256:b625d6be2a3ccb56f3277e835b343d33a0b2e93e56e238a48daf830d3b7219f2 

如果忘記或者過期可以使用以下命令重新生成

kubeadm token create --print-join-command
  • 檢視叢集狀態(master 節點執行)
kubectl get nodes

輸出

NAME          STATUS     ROLES           AGE     VERSION
k8s-master    NotReady   control-plane   8m42s   v1.27.1
k8s-worker1   NotReady   <none>          82s     v1.27.1
k8s-worker2   NotReady   <none>          84s     v1.27.1

可以看到所有節點都是 NotReady ,是因為還沒有設定網路

  • 設定網路(僅在master節點執行)

k8s版本要與Calico版本對應上,具體檢視

https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements

下載calico.yaml檔案

wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml

修改calico.yaml檔案

- name: CLUSTER_TYPE下方新增如下內容

- name: CLUSTER_TYPE
  value: "k8s,bgp"
  #下方為新增內容
- name: IP_AUTODETECTION_METHOD
  value: "interface=master節點主機的網路卡名稱"

設定網路

kubectl apply -f calico.yaml

再次檢視節點資訊

kubectl get nodes

依然還是沒有成功;檢視 pod 狀態,沒有正常啟動

kubectl get pods --all-namespaces -o wide | grep kube-system

使用crictl logs命令檢視任何一個pod,發現有如下錯誤

crictl logs coredns-7bdc4cb885-28jnf

kubectl logs -n kube-system命令檢視狀態不是running的pod,發現有如下錯誤

kubectl logs -n kube-system calico-node-bfxtk
kubectl logs -n kube-system coredns-7bdc4cb885-28jnf

新建/etc/crictl.yaml檔案,寫入如下內容

runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

使用kubectl delete pod -n kube-system命令刪除那些狀態不是running的pod。例如

kubectl delete pod -n kube-system calico-kube-controllers-6c99c8747f-kmkdl

再次檢視pod的啟動狀態,全部都是在running狀態

kubectl get pod -n kube-system

另外crictl ps也可以使用了。

crictl ps -a

使用crictl logs也可以檢視紀錄檔了

crictl logs 4838afe83150e

15.其他

  • k8s命令補全
! grep -q kubectl "$HOME/.bashrc" && echo "source /usr/share/bash-completion/bash_completion" >>"$HOME/.bashrc"
! grep -q kubectl "$HOME/.bashrc" && echo "source <(kubectl completion bash)" >>"$HOME/.bashrc"
! grep -q kubeadm "$HOME/.bashrc" && echo "source <(kubeadm completion bash)" >>"$HOME/.bashrc"
! grep -q crictl "$HOME/.bashrc" && echo "source <(crictl completion bash)" >>"$HOME/.bashrc"
source "$HOME/.bashrc"
  • 常用命令
# 獲取節點
kubectl get nodes -o wide
# 實時查詢nodes狀態
watch kubectl get nodes -o wide
# 獲取pod
kubectl get pods --all-namespaces -o wide
# 檢視映象列表
kubeadm config images list
# 節點加入叢集
kubeadm token create --print-join-command
# 描述node
kubectl describe node k8s-master
# 描述pod
kubectl describe pod kube-flannel-ds-hs8bq --namespace=kube-system

16.測試

以下命令在主節點執行

  • 建立一個 nginx
kubectl create deployment nginx --image=nginx
  • 檢視狀態
kubectl get pods -o wide

等待ContainerCreating變成Running後執行下一個步驟

  • 暴露埠
kubectl expose deployment nginx --port=80 --type=NodePort
  • 檢視 pos 及服務資訊
kubectl get pod,svc

  • 在瀏覽器中存取
http://192.168.10.155:31930/

地址根據你自己的主機變化,埠上面輸出的資訊中 PORT(S) 這一欄會有