在開始之前,部署Kubernetes叢集機器需要滿足以下幾個條件:
角色 | IP | HostName |
---|---|---|
master | 172.16.3.181 | k8smaster |
node1 | 172.16.3.182 | k8snode1 |
node2 | 172.16.3.183 | k8snode2 |
# 關閉防火牆
[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
Kubernetes預設CRI(容器執行時)為Docker,因此先安裝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
[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
由於版本更新頻繁,這裡指定版本號部署:
[root@localhost ~]# yum install -y kubelet-1.18.19 kubeadm-1.18.19 kubectl-1.18.19
[root@localhost ~]# systemctl enable kubelet
在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 ~]#
向叢集新增新節點,執行在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 外掛
[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 上去
在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