使用 Kubeadm 部署 K8S安裝

2022-10-13 18:17:02

1. 安裝要求

在開始之前,部署Kubernetes叢集機器需要滿足以下幾個條件:

  • 一臺或多臺機器,作業系統 CentOS7.x-86_x64
  • 硬體設定:2GB或更多RAM,2個CPU或更多CPU,硬碟30GB或更多
  • 可以存取外網,需要拉取映象,如果伺服器不能上網,需要提前下載映象並匯入節點
  • 禁止swap分割區

2. 準備環境

角色 IP HostName
master 172.16.3.181 k8smaster
node1 172.16.3.182 k8snode1
node2 172.16.3.183 k8snode2

2.1. 基礎設定

# 關閉防火牆
[root@localhost ~]# firewall-cmd --state #檢視防火牆狀態
[root@localhost ~]# systemctl stop firewalld     # 停止防火牆的服務
[root@localhost ~]# systemctl disable firewalld    # 禁止開機啟動

# 關閉selinux
[root@localhost ~]# setenforce 0  # 臨時(當前不用重啟)
[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久(重啟後生效)

[root@localhost ~]# sestatus -v  # 檢視狀態(需要重啟生效)

# 關閉swap
[root@localhost ~]# swapoff -a  # 臨時
[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久


# 根據規劃設定主機名
[root@localhost ~]# hostnamectl set-hostname k8smaster  #其它的伺服器為 k8snode1,k8snode2

# 在master新增hosts
[root@localhost ~]# cat >> /etc/hosts << EOF
172.16.3.181 k8smaster
172.16.3.182 k8snode1
172.16.3.183 k8snode2
EOF

# 將橋接的IPv4流量傳遞到iptables的鏈(三臺都執行)
[root@localhost ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@localhost ~]# sysctl --system  # 生效

# 時間同步
[root@localhost ~]# yum install ntpdate -y
[root@localhost ~]# ntpdate time.windows.com

3. 所有節點安裝Docker/kubeadm/kubelet

Kubernetes預設CRI(容器執行時)為Docker,因此先安裝Docker。

3.1 安裝Docker

[root@localhost ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@localhost ~]# yum -y install docker-ce-19.03.11
[root@localhost ~]# systemctl enable docker && systemctl start docker
[root@localhost ~]# docker --version

[root@localhost ~]# cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF 

3.2 新增阿里雲YUM軟體源

[root@localhost ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
EOF

3.3 安裝kubeadm,kubelet和kubectl

由於版本更新頻繁,這裡指定版本號部署:

[root@localhost ~]# yum install -y kubelet-1.18.19 kubeadm-1.18.19 kubectl-1.18.19
[root@localhost ~]# systemctl enable kubelet

4. 部署Kubernetes Master

在172.16.3.181(Master)執行。

[root@localhost ~]# kubeadm init \
  --apiserver-advertise-address=172.16.3.181 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.19 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

說明:
--apiserver-advertise-address=172.16.3.181 #master的ip地址
--image-repository registry.aliyuncs.com/google_containers #指定從什麼位置拉取映象
--kubernetes-version=v1.18.19 #指定k8s版本,根據具體版本進行修改
--service-cidr=10.96.0.0/16 #指定service網路的範圍
--pod-network-cidr=10.244.0.0/16 #指定pod網路的範圍

由於預設拉取映象地址k8s.gcr.io國內無法存取,這裡指定阿里雲映象倉庫地址。

使用kubectl工具:

[root@k8smaster ~]# mkdir -p $HOME/.kube
[root@k8smaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8smaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8smaster ~]# kubectl get nodes
NAME        STATUS     ROLES    AGE     VERSION
k8smaster   NotReady   master   5m40s   v1.18.19
[root@k8smaster ~]# 

5. 加入 K8S Node

向叢集新增新節點,執行在kubeadm init輸出的kubeadm join命令:

[root@k8snode2 ~]# kubeadm join 172.16.3.181:6443 --token jvv3up.7oy3647hgiozpoh7 \
    --discovery-token-ca-cert-hash sha256:962693618045022ac50317a00397e917dc5881ccb1152d53b586907ccc179724 

預設token有效期為24小時,當過期之後,該token就不可用了。這時就需要重新建立token,操作如下:

[root@k8snode2 ~]# kubeadm token create --print-join-command


再回到 Mater 上執行,會發現 node 已經加進來了

狀態為 NotReady 需要安裝 CNI 外掛

6. 部署CNI網路外掛

[root@k8smaster ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#檢視 pods 情況
[root@k8smaster ~]# kubectl get pods -n kube-system 
#檢視 nodes 情況
[root@k8smaster ~]# kubectl get nodes

如果 kubectl apply -f 後面的地址下不下來。可以單獨下載下來。然後 apply 上去

7. 測試kubernetes叢集

在Kubernetes叢集中建立一個pod,驗證是否正常執行:

# 拉一個 Nginx 下來,便於測試用
[root@k8smaster ~]# kubectl create deployment nginx --image=nginx
# 檢視狀態
[root@k8smaster ~]# kubectl get pod
# 對外暴露 80 埠
[root@k8smaster ~]# kubectl expose deployment nginx --port=80 --type=NodePort
# 
$ kubectl get pod,svc

存取地址:http://NodeIP:Port