Kubeadm部署Kubernetes集羣

Kubeadm部署Kubernetes1.14.1集羣

原理
kubeadm做爲集羣安裝的“最佳實踐”工具,目標是通過必要的步驟來提供一個最小可用的集羣運行環境。它會啓動集羣的基本組件以及必要的附屬組件,至於爲集羣提供更豐富功能(比如監控,度量)的組件,不在其安裝部署的範圍。在環境節點符合其基本要求的前提下,kubeadm只需要兩條基本命令便可以快捷的將一套集羣部署起來。
這兩條命令分別是:

kubeadm init:初始化集羣並啓動master相關組件,在計劃用做master的節點上執行。

kubeadm join:將節點加入上述集羣,在計劃用做node的節點上執行。

一、環境說明

主機名 IP地址 角色 系統
k8s-node-1 192.168.11.131 k8s-master Centos7.6
k8s-node-2 192.168.11.134 k8s-node Centos7.6
k8s-node-3 192.168.111.133 k8s-node Centos7.6

注意:官方建議每臺機器至少雙核2G內存,同時需確保MAC和product_uuid唯一(參考下面的命令查看)

ip link
cat /sys/class/dmi/id/product_uuid

注:Kubernetes大致有以下幾種安裝方式:

直接yum安裝,yum install -y kubernetes 這樣最快,但是此版本較低
去github上下載,用ansible部署安裝,但需要對ansible有一定的瞭解
在每個節點(Master/Node)上按組件逐一安裝,慎用,有可能會崩潰,特別複雜,而且還不一定搞好。
利用一些提供的安裝工具來安裝,如kubeadm,下邊介紹這個安裝方式

二、環境配置

以下命令在三臺主機上均需運行

1、設置阿里雲yum源(可選)

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
rm -rf /var/cache/yum && yum makecache && yum -y update && yum -y autoremove

2、安裝依賴包

yum install -y epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

3、關閉防火牆

systemctl stop firewalld && systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

4、關閉SELinux

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

5、關閉swap分區

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

6、加載內核模塊

modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

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
modprobe -- br_netfilter
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

7、設置內核參數

cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

sysctl -p /etc/sysctl.d/k8s.conf

8、安裝Docker

1、首先卸載舊版:

yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-selinux \
           docker-engine-selinux \
           docker-engine

2、安裝依賴包:

yum install -y yum-utils device-mapper-persistent-data lvm2

3、設置安裝源(阿里雲):

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、啓用測試庫(可選):

yum-config-manager --enable docker-ce-edge
yum-config-manager --enable docker-ce-test

5、安裝:

yum makecache fast
yum install -y docker-ce  安裝docker最新版

6、啓動:

systemctl start docker

開機自啓

systemctl enable docker

Docker建議配置阿里雲鏡像加速

安裝完成後配置啓動時的命令,否則docker會將iptables FORWARD chain的默認策略設置爲DROP

另外Kubeadm建議將systemd設置爲cgroup驅動,所以還要修改daemon.json

sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service

mkdir  -p  /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bk6kzfqm.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

systemctl daemon-reload
systemctl restart docker

9、安裝kubeadm和kubelet

配置源

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=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

yum makecache fast

安裝

yum install -y kubelet kubeadm kubectl 
systemctl enable kubelet 

10、拉取所需鏡像

先從阿里雲拉取所需的鏡像,不然會從谷歌拉取,導致拉取失敗。

拉取鏡像:

kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x 

三、初始化集羣

以下命令如無特殊說明,均在k8s-node-1上執行

1、使用kubeadm init初始化集羣(注意修改最後爲本機IP)

kubeadm init \
  --kubernetes-version=v1.14.1 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.11.128

Kubeadm部署Kubernetes集羣

Kubeadm部署Kubernetes集羣

初始化成功後會輸出類似下面的加入命令,暫時無需運行,先記錄。

kubeadm join 192.168.11.131:6443 --token duz8m8.njvafly3p2jrshfx --discovery-token-ca-cert-hash sha256:60e15ba0f562a9f29124914a1540bd284e021a37ebdbcea128f4e257e25002db

2、爲需要使用kubectl的用戶進行配置

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOM![](https://s1.51cto.com/images/blog/201905/15/3124c9a500f308a5e31764dff8c0b36e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
E/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

檢查集羣狀態

kubectl get cs

3、安裝Pod Network(使用七牛雲鏡像)

curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sed -i "s/quay.io\/coreos\/flannel/quay-mirror.qiniu.com\/coreos\/flannel/g" kube-flannel.yml
kubectl apply -f kube-flannel.yml
rm -f kube-flannel.yml

使用下面的命令確保所有的Pod都處於Running狀態,可能要等到許久。

kubectl get pod --all-namespaces -o wide

Kubeadm部署Kubernetes集羣

4、向Kubernetes集羣中添加Node節點

k8s-node-2k8s-node-3上運行之前在k8s-node-1輸出的命令

kubeadm join 192.168.11.131:6443 --token duz8m8.njvafly3p2jrshfx --discovery-token-ca-cert-hash sha256:60e15ba0f562a9f29124914a1540bd284e021a37ebdbcea128f4e257e25002db

Kubeadm部署Kubernetes集羣

Kubeadm部署Kubernetes集羣

在k8s-node1上查看集羣中的節點狀態,可能要等等許久才Ready

kubectl get nodes

![](https://s1.51cto.com/images/blog/201905/15/1f4dc5c14adedd1ba0c91e44316884da.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

如果添加集羣失敗,重置從節點配置
kubeadm reset

5、kube-proxy開啓ipvs

kubectl get configmap kube-proxy -n kube-system -o yaml > kube-proxy-configmap.yaml
sed -i 's/mode: ""/mode: "ipvs"/' kube-proxy-configmap.yaml
kubectl apply -f kube-proxy-configmap.yaml
rm -f kube-proxy-configmap.yaml
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}' 

四、部署kubernetes-dashboard

1、生成訪問證書

grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

將生成的kubecfg.p12證書導入到Windows中,直接雙擊打開,下一步導入即可。

注意:導入完成後需重啓瀏覽器。

2、生成訪問Token

新建文件admin-user.yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

創建角色及綁定賬號

kubectl create -f admin-user.yaml

獲取Token

kubectl describe secret admin-user --namespace=kube-system

Kubeadm部署Kubernetes集羣

此次先記錄下生成的Token,一會登錄要用

3、部署kubernetes-dashboard

curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
vi kubernetes-dashboard.yaml
修改image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1爲:
image: mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1
kubectl apply -f kubernetes-dashboard.yaml

4、訪問

https://192.168.11.131:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

192.167.11.131爲MasterIP,6443爲apiserver-port

然後在登錄選項中選擇令牌登錄,複製進剛剛生成的令牌即可。

Kubeadm部署Kubernetes集羣

Kubeadm部署Kubernetes集羣

注:如果訪問不了網站,則

查所有的Pod確保都處於Running狀態,如果 pod kubectl get pod --all-namespaces -o wide不是Running狀態則刪除再新建

kubectl get pod --all-namespaces -o wide

kubectl delete pod kubernetes-dashboard-68ddcc97fc-bqxsd

重新起kubernetet-dashboard

kubectl apply -f kubernetes-dashboard.yaml

如果kubernetes-dashboard-68ddcc97fc-bqxsd 還是起不來則導入

docker pull mirrorgooglecontainers/kubernetes-dashboard-amd64:v1.10.1

重新起kubernetet-dashboard

kubectl apply -f kubernetes-dashboard.yaml

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