Kubernetes1.16.0集羣搭建(二)

一 環境準備

在安裝之前,需要先做如下準備。兩臺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首頁如圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章