kubeadm部署k8s v1.11.0

Author:zhutong Time:2019-11-12
一、系統配置:
關閉防火牆、禁用selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

編輯文件/etc/selinux/config,將SELINUX修改爲disabled,如下:
sed -i ‘s/SELINUX=permissive/SELINUX=disabled/g’ /etc/sysconfig/selinux
SELINUX=disabled

關閉系統Swap:1.15之後的新規定(我安裝1.11.0也需要關閉,不然初始化會報錯)
Kubernetes 1.8開始要求關閉系統的Swap,如果不關閉,默認配置下kubelet將無法啓動。方法一,通過kubelet的啓動參數–fail-swap-on=false更改這個限制。方法二,關閉系統的Swap。

swapoff -a
修改/etc/fstab文件,註釋掉SWAP的自動掛載,使用free -m確認swap已經關閉。

二、安裝低版本docker
v1.11.0版本推薦使用docker v17.03,
v1.11,v1.12,v1.13, 也可以使用,再高版本的docker可能無法正常使用(親測19以上的docker無法使用)

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
查看Docker版本:
yum list docker-ce --showduplicates

安裝較舊版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,並且加上–setopt=obsoletes=0 參數

yum install -y --setopt=obsoletes=0
docker-ce-17.03.2.ce-1.el7.centos.x86_64
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
systemctl enable docker
systemctl start docker.service
docker -v

三、使用kubeadm部署k8s

在所有節點安裝kubeadm和kubelet(master需要安裝kubectl):
配置源

cat < /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

安裝
yum makecache fast
yum install -y kubelet-1.11.0
yum install -y kubeadm-1.11.0 kubectl-1.11.0 [分兩步裝 不然報錯]

配置:
配置轉發相關參數,否則可能會出錯

查看是否開啓:sysctl net.ipv4.ip_forward
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
{如果net.bridge.bridge-nf-call-iptables=1,也就意味着二層的網橋在轉發包時也會被iptables的FORWARD規則所過濾,這樣就會出現L3層的iptables rules去過濾L2的幀的問題}
使配置生效
sysctl --system

如果net.bridge.bridge-nf-call-iptables報錯,加載br_netfilter模塊
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

加載ipvs相關內核模塊(低版本不需要)
如果重新開機,需要重新加載(可以寫在 /etc/rc.local 中開機自動加載)
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
查看是否加載成功
lsmod | grep ip_vs

配置啓動kubelet(所有節點)
配置kubelet使用國內pause鏡像
獲取docker的cgroups

DOCKER_CGROUPS=$(docker info | grep ‘Cgroup’ | cut -d’ ’ -f3)[只針對此安裝docker版本,其他版本的docker 驅動獲取可能有點差異 ]
echo $DOCKER_CGROUPS

配置kubelet的cgroups
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="–cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF

啓動
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet(這時候所有節點的kubelet都無法啓動,結合二進制安裝可知道,只有master生成相關證書,認證各個節點的kubelet才能夠啓動成功。即master初始化集羣,node節點加入集羣)

配置master節點
下載鏡像,重新打tag

kubeadm config images list 查看初始化集羣所需鏡像
[root@master ~]# more images.sh
#!/bin/bash
docker pull mirrorgooglecontainers/kube-apiserver:v1.11.0
docker tag mirrorgooglecontainers/kube-apiserver:v1.11.0 k8s.gcr.io/kube-apiserver:v1.11.0
docker pull mirrorgooglecontainers/kube-controller-manager:v1.11.0
docker tag mirrorgooglecontainers/kube-controller-manager:v1.11.0 k8s.gcr.io/kube-controller-manager:v1.11.0
docker pull mirrorgooglecontainers/kube-scheduler:v1.11.0
docker tag mirrorgooglecontainers/kube-scheduler:v1.11.0 k8s.gcr.io/kube-scheduler:v1.11.0
docker pull mirrorgooglecontainers/kube-proxy:v1.11.0
docker tag mirrorgooglecontainers/kube-proxy:v1.11.0 k8s.gcr.io/kube-proxy:v1.11.0
docker pull mirrorgooglecontainers/pause:3.1
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker pull coredns/coredns:1.2.6
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

cat >kubeadm-master.config<<EOF
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
api:
advertiseAddress: 6.6.6.134

controllerManagerExtraArgs:
node-monitor-grace-period: 10s
當node失聯後一段時間後,kubernetes判定node爲notready狀態,這段時長的配置項爲 node-monitor-grace-period ,默認40s
pod-eviction-timeout: 10s
即當節點宕機該事件間隔後,開始eviction機制,驅趕宕機節點上的Pod,默認爲5min
networking:
podSubnet: 10.244.0.0/16[預定義k8s集羣的網段]

以下不需要配置,k8s以下的版本中,默認只是iptables.
kubeProxy:
config:
# mode: ipvs
mode: iptables
EOF

拉取鏡像,若不成功,可執行多次
kubeadm reset(重置)
kubeadm config images pull --config kubeadm-master.config
初始化
kubeadm init --config kubeadm-master.config

配置使用kubectl
如下操作在master節點操作[給kubectl授權 讓其有權限調用apiserver]
rm -rf $HOME/.kube
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown (idu):(id -u):(id -g) $HOME/.kube/config

查看node節點
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m19s v1.11.0

只有網絡插件也安裝配置完成之後,才能顯示爲ready狀態


配置node節點加入集羣:
在所有node節點操作,此命令爲初始化master成功後返回的結果,互相認證,互傳證書
kubeadm join 6.6.6.134:6443 --token 6twecq.lwprt3k2tfet7hhs --discovery-token-ca-cert-hash sha256:698ea50c43e91f2fb383a847f5aa8c3d133cffa76936171c0716fda55b3cb128

這條命令如果有使用的應當清楚是讓新的機器加入到k8s當中並充當worker nodes,只需要在後面跟上--experimental-control-plane 就能讓該節點部署master上的所有組件包括etcd,如果在第一次配置中指定etcd配置(外部部署etcd),那麼會直接跳過

配置使用網絡插件
在master節點操作

下載配置
cd ~ && mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

修改配置文件kube-flannel.yml:
此處的ip配置要與上面kubeadm的pod-network一致,本來就一致,不用改
net-conf.json: |
{
“Network”: “10.244.0.0/16”,
“Backend”: {
“Type”: “vxlan”
}
}
#默認的鏡像是quay.io/coreos/flannel:v0.10.0-amd64,如果你能pull下來就不用修改鏡像地址,否則,修改yml中鏡像地址爲阿里鏡像源
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64

#目前需要在kube-flannel.yml中使用–iface參數指定集羣主機內網網卡的名稱,
#否則可能會出現dns無法解析。容器無法通信的情況,需要將kube-flannel.yml下載到本地,

#flanneld啓動參數加上–iface=
containers:

  • name: kube-flannel
    image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
    command:
  • /opt/bin/flanneld
    args:
  • –ip-masq
  • –kube-subnet-mgr
  • –iface=ens33
  • –iface=eth0

⚠️⚠️⚠️–iface=ens33 的值,是你當前的網卡,或者可以指定多網卡

啓動:
kubectl apply -f kube-flannel.yml

查看:
kubectl get pods --namespace kube-system
kubectl get service
kubectl get svc --namespace kube-system
只有網絡插件也安裝配置完成之後,才能會顯示爲ready狀態

驗證集羣
[root@master flannel]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-777d78ff6f-d5fmr 1/1 Running 0 1h
coredns-777d78ff6f-nwsrd 1/1 Running 0 1h
etcd-master 1/1 Running 1 21m
kube-apiserver-master 1/1 Running 3 20m
kube-controller-manager-master 1/1 Running 4 21m
kube-flannel-ds-56ljv 1/1 Running 0 1m
kube-flannel-ds-grw75 1/1 Running 0 1m
kube-flannel-ds-snn7s 1/1 Running 1 1m
kube-proxy-g7682 1/1 Running 1 1h
kube-proxy-j5j6k 1/1 Running 0 21m
kube-proxy-kbk75 1/1 Running 0 17m
kube-scheduler-master 1/1 Running 5 21m

查看node(未配置網絡之前,node節點都是notready狀態)
[root@master flannel]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 1h v1.11.0
node1 Ready 30m v1.11.0
node2 Ready 29m v1.11.0

若node已經加入集羣,但是狀態顯示NotReady,首先嚐試重啓kubelet

默認token的有效期爲24小時,當過期之後,該token就不可用了。
1.重新生成node節點加入集羣的token
kubeadm token create --print-join-command


其他node節點需要加入集羣,直接複製即可








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