一 環境準備
在安裝之前,需要先做如下準備。兩臺CentOS 7.6主機如下:
Kubernetes支持在物理服務器或虛擬機中運行,本次使用虛擬機準備測試環境,硬件配置信息如表所示:
IP地址 | 節點角色 | CPU | Memory | Hostname | 磁盤 |
192.168.237.144 | master | >=2c | >=2G | master | sda、sdb |
192.168.237.149 | node1 | >=2c | >=2G | node1 | sda、sdb |
192.168.237.150 | node2 | >=2c | >=2G | node2 | sda、sdb |
注:在所有節點上進行如下操作
1.設置主機名hostname,管理節點設置主機名爲 master 。
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
2.編輯 /etc/hosts 文件,添加域名解析。
cat <<EOF >>/etc/hosts
192.168.237.144 master
192.168.237.149 node1
192.168.237.150 node2
EOF
3.關閉防火牆、selinux和swap。
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
使命名生效
sysctl --system
4.配置內核參數,將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
執行命令使修改生效。
sysctl --system
sysctl -p /etc/sysctl.d/k8s.conf
modprobe br_netfilter
5.配置國內yum源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache
6.配置國內Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.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.gpg
EOF
7.配置 docker 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
7.kube-proxy開啓ipvs的前置條件
由於ipvs已經加入到了內核的主幹,所以爲kube-proxy開啓ipvs的前提需要加載以下的內核模塊:ip_vs、ip_vs_rr、ip_vs_wrr、ip_vs_sh、nf_conntrack_ipv4。
注:在所有節點上進行如下操作
#8.1 保證在節點重啓後能自動加載所需模塊
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#8.2 修改權限
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#8.3查看是否已經正確加載所需的內核模塊。
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
yum install ipset
yum install ipvsadm
注:如果以上前提條件如果不滿足,則即使kube-proxy的配置開啓了ipvs模式,也會退回到iptables模式。
二、軟件安裝
注:在所有節點上進行如下操作
1.安裝docker
yum list docker-ce.x86_64 --showduplicates |sort -r
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable
docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
yum makecache fast
yum install -y docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version
Docker version 18.06.1-ce, build e68fc7a
確認一下iptables filter表中FOWARD鏈的默認策略(pllicy)爲ACCEPT。
iptables -nvL
Chain INPUT (policy ACCEPT 263 packets, 19209 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
docker服務爲容器運行提供計算資源,是所有容器運行的基本平臺。
2.修改docker cgroup driver爲systemd
根據文檔CRI installation中的內容,對於使用systemd作爲init system的Linux的發行版,使用systemd作爲docker的cgroup driver可以確保服務器節點在資源緊張的情況更加穩定,因此這裏修改各個節點上docker的cgroup driver爲systemd。
創建或修改/etc/docker/daemon.json:
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
重啓docker:
systemctl restart docker
docker info | grep Cgroup
Cgroup Driver: systemd
2.安裝kubeadm、kubelet、kubectl
2.1 新建安裝部署目錄
mkdir -p /etc/kuber/kubeadm
2.2 安裝kubeadm、kubelet、kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
Kubelet負責與其他節點集羣通信,並進行本節點Pod和容器生命週期的管理。Kubeadm是Kubernetes的自動化部署工具,降低了部署難度,提高效率。Kubectl是Kubernetes集羣管理工具。
三、部署master 節點
注:在master節點上進行如下操作
1.1 創建一個初始初始化文件,我使用的flannel 網絡插件需要配置網絡參數 --pod-network-cidr=10.244.0.0/16
vim /etc/kuber/kubeadm/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.237.174
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
1.2 在master進行Kubernetes集羣初始化。
在各節點開機啓動kubelet服務:
systemctl enable kubelet.service
打印集羣初始化默認的使用的配置:
kubeadm config print init-defaults
初始化方式一
kubeadm init --kubernetes-version=1.16.0 --apiserver-advertise-address=192.168.237.161 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
初始化方式二
kubeadm init --config config.yaml
使用upload-certs和config指定初始化集羣。
kubeadm init --config /etc/kuber/kubeadm/kubeadm-config.yaml --ignore-preflight-errors=Swap
初始化返回數據
kubeadm join 192.168.237.174:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2e8a3cf1d0524213416653301b64c48e51693ca16e2290bc651534420eba96a6
推薦清理環境
如果之前配置過k8s或者首次配置沒有成功等情況,推薦把系統環境清理一下,每一個節點。
systemctl stop kubelet
docker rm -f -v $(docker ps -a -q)
rm -rf /etc/kubernetes
rm -rf /var/lib/etcd
rm -rf /var/lib/kubelet
rm -rf $HOME/.kube/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
yum reinstall -y kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet
kubeadm join 192.168.237.174:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2e8a3cf1d0524213416653301b64c48e51693ca16e2290bc651534420eba96a6
定義POD的網段爲: 10.244.0.0/16, api server地址就是master本機IP地址。
這一步很關鍵,由於kubeadm 默認從官網k8s.grc.io下載所需鏡像,國內無法訪問,因此需要通過–image-repository指定阿里雲鏡像倉庫地址,很多新手初次部署都卡在此環節無法進行後續配置。
集羣初始化成功後返回如下信息:
記錄生成的最後部分內容,此內容需要在其它節點加入Kubernetes集羣時執行。
kubeadm join 192.168.237.144:6443 --token ps91w8.m7ulptjj7qjzzg4e \
--discovery-token-ca-cert-hash sha256:0014de3b706d096a735d8c775387171f3649c7b074533f549ff029d8974bc926
2.配置kubectl工具
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
kubectl get cs
3.部署flannel網絡
mkdir -p ~/k8s/
cd ~/k8s
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
返回數據:
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
4. 確保集羣處於Running狀態
kubectl get pod -n kube-system
5. 確定集羣是否可用
kubectl run curl --image=radial/busyboxplus:curl -it
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-5cc7b478b6-r997p:/ ]$
四、部署node節點
注:在所有node節點上進行如下操作
執行如下命令,使所有node節點加入Kubernetes集羣。
kubeadm join 192.168.237.144:6443 --token ps91w8.m7ulptjj7qjzzg4e \
--discovery-token-ca-cert-hash sha256:0014de3b706d096a735d8c775387171f3649c7b074533f549ff029d8974bc926
備註:此命令爲集羣初始化時(kubeadm init)返回結果中的內容。
五、集羣狀態檢測
注:在master節點上進行如下操作
1.在master節點輸入命令檢查集羣狀態,返回如下結果則集羣狀態正常。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 26m v1.16.0
node1 Ready <none> 3m10s v1.16.0
node2 Ready <none> 3m v1.16.0
重點查看STATUS內容爲Ready時,則說明集羣狀態正常。
2.創建Pod以驗證集羣是否正常。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
七、部署Dashboard
注:在master節點上進行如下操作
1.創建Dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
使用如下命令或直接手動編輯kubernetes-dashboard.yaml文件
sed -i 's/k8s.gcr.io/loveone/g' kubernetes-dashboard.yaml
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml
手動編輯kubernetes-dashboard.yaml文件時,需要修改兩處內容,首先在Dashboard Deployment部分修改Dashboard鏡像下載鏈接,由於默認從官方社區下載,而不“科學上網”是無法下載的,因此修改爲:image: loveone/kubernetes-dashboard-amd64:v1.10.1 修改後內容如圖:
此外,需要在Dashboard Service內容加入nodePort: 30001和type: NodePort兩項內容,將Dashboard訪問端口映射爲節點端口,以供外部訪問,編輯完成後,狀態如圖
2.部署Dashboard
kubectl create -f kubernetes-dashboard.yaml
3.創建完成後,檢查相關服務運行狀態
kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system -o wide
kubectl get services -n kube-system
netstat -ntlp|grep 30001
4.在Firefox瀏覽器輸入Dashboard訪問地址:https://10.10.10.10:30001
5.查看訪問Dashboard的認證令牌
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
6.使用輸出的token登錄Dashboard。
認證通過後,登錄Dashboard首頁如圖