實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群

導讀比起二進制安裝,使用 kubeadm 來快速部署 kubernetes 集群是比較方便快捷的,本文使用 kubeadm 部署 kubernetes 1.15.2 集群,十分鐘內就能搞定,順便解決了一個問題,那就是 kubeadm 的證書問題,默認情況下生成的證書有效期是一年,下文針對這個做了調整。

我這裡使用了兩臺服務器,一個 master 一個 node,系統採用 Centos7.6-86_x64,你的服務器需要滿足如下要求,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


一定要關閉 swap&selinux&firewall

安裝 docker-ce

自行設置主機名修改 host 文件吧,

[root@kubeadm ~]# cat /etc/hosts
192.168.1.237 kubeadm
192.168.1.224 node-1

開始安裝 docker-ce,所有服務器執行,這次用的是阿里雲的源,

[root@kubeadm ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@kubeadm ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@kubeadm ~]# yum -y install docker-ce
[root@kubeadm ~]# systemctl enable docker.service
[root@kubeadm ~]# systemctl start docker.service

這樣就可以了,安裝目前最新版本,也就是 docker-ce 19.03.1,其實還是建議裝 18.09.x 版本的 docker-ce,因為目前 kubeadm 支持列表裡還沒有 19.x 版本的,我裝了 19.03.1 用著貌似也沒啥問題,只是在初始化集群的時候拋一條警告,如果想裝老版本可以這樣搜一下。

[root@kubeadm ~]# yum list docker-ce.x86_64 --showduplicates | sort -r

找到之後就可以指定版本號了進行安裝了,

[root@kubeadm ~]# yum install docker-ce-${VERSION}

docker-ce 安裝這塊就這麼多,開始環境初始化吧。

環境初始化

創建 /etc/sysctl.d/k8s.conf 文件,全部服務器執行,將橋接的 IPv4 流量傳遞到 iptables 的鏈

[root@kubeadm ~]# cat > /etc/sysctl.d/k8s.conf < net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> OEF
[root@kubeadm ~]# sysctl --system

加載 IPVS 模塊,全部服務器執行,

[root@kubeadm ~]# cat > /etc/sysconfig/modules/ipvs.modules < #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF
[root@kubeadm ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

安裝 kubelet/kubeadm/kubectl

還是用阿里雲的源,全部服務器執行,順便安裝了 ipset

[root@kubeadm ~]# cat < /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF
[root@kubeadm ~]# yum -y install kubelet-1.15.2 kubeadm-1.15.2 kubectl-1.15.2 ipset

指定版本,安裝 1.15.2 的,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


下面開始初始化集群。

集群初始化

上面提到了,默認生成的證書有效期是一年,我在狗頭的幫助下將 kubeadm 生成的證書有效期時間由之前的 1 年改到了十年,這個不是很麻煩,大概這樣改,

重新編譯 kubeadm

這一步不是必須的,看自己的情況吧,從昨天下午開始,我就在找延長證書時間的辦法,結果都是需要修改 Kubernetes 源碼後重新重新編譯 kubeadm,所以我也按著他們方法試了一下,主要是根據這篇文章,我拉完代碼後發現他的編譯環境鏡像版本有點低,編譯當前 kubernetes 源碼需要 go1.12.1 or later,而他的版本是 go1.11.2,所以我看了一下這個鏡像的層信息,基於 golang:latest 鏡像重做了一個,能編譯後發現這樣改不生效,還是默認的一年,經過多次折騰和狗頭的幫助終於是成功了,大概是這樣,編譯環境鏡像我也傳到 dockerhub 上了,直接拉就可以了,先把 kubernetes 源碼拉下來吧,

[root@kubeadm ~]# cd /tmp/
[root@kubeadm /tmp]# git clone https://github.com/kubernetes/kubernetes/
 

拉下來之後掛載到容器去編譯,環境都弄好了,

[root@kubeadm /tmp]# docker run -it --rm -v /tmp/kubernetes:/go/src/k8s.io/kubernetes bairuijie/k8s-build:latest bash

這個鏡像很大,在 1.7G 左右,運行以上命令後可以去吸根菸,回來就差不多了,

抽完回來了,然後進入到這個目錄,

root@59d82c96c611:/go# cd src/k8s.io/kubernetes/
root@59d82c96c611:/go/src/k8s.io/kubernetes# pwd
/go/src/k8s.io/kubernetes

這裡就不扯別的了,直接去改這個文件,再開一個窗口去編輯他,

[root@kubeadm /tmp/kubernetes]# vim ./cmd/kubeadm/app/constants/constants.go
 CertificateValidity = time.Hour * 24 * 365

默認是一年,我加了個 0,也就是十年了,剩下的不要動,保存退出,然後 CertificateValidity 被這裡引用,

[root@kubeadm /tmp/kubernetes]# cat ./cmd/kubeadm/app/util/pkiutil/pki_helpers.go
 kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
 NotAfter: time.Now().Add(kubeadmconstants.CertificateValidity).UTC(),

這樣就行了,重新編譯 kubeadm 即可,

root@59d82c96c611:/go/src/k8s.io/kubernetes# make WHAT=cmd/kubeadm GOFLAGS=-v


實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


編譯成功後二進制文件在
./_output/local/bin/linux/amd64/ 目錄下,直接覆蓋掉 /usr/bin/ 下的 kubeadm 就行了,這個只在 master 節點替換掉就行了,

[root@kubeadm /tmp]# \mv kubernetes/_output/local/bin/linux/amd64/kubeadm /usr/bin/

如果你嫌麻煩可以直接用我這個編譯好的,最近又改了一下證書的有效期,總之在座各位有生之年是看不到它過期了,

[root@rj-bai ~]# wget http://rj-bai.oss-cn-beijing.aliyuncs.com/kubeadm -O /usr/bin/kubeadm && chmod +x /usr/bin/kubeadm

好了,下面可以初始化集群了,

集群初始化

這裡直接用配置文件去初始化了,不用命令行,配置文件如下,

[root@kubeadm ~]# cat kubeadm.yaml 
apiServer:
 extraArgs:
 authorization-mode: Node,RBAC
 timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
dns:
 type: CoreDNS
etcd:
 local:
 dataDir: /var/lib/etcd
imageRepository: swr.cn-north-1.myhuaweicloud.com/rj-bai
kind: ClusterConfiguration
kubernetesVersion: v1.15.2
networking:
 dnsDomain: cluster.local
 serviceSubnet: 10.1.0.0/16
 podSubnet: 10.244.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

鏡像用的是我華為雲上的鏡像,啟用了 ipvs 代理模式,podSubnet 網段不要改撒,必須是這個,就這樣,可以創建了,

[root@kubeadm ~]# systemctl enable kubelet.service
[root@kubeadm ~]# kubeadm init --config kubeadm.yaml

看到這個就表示成功了,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


讓你執行三條命令,執行一下就完了,執行完之後看一下 pod

[root@kubeadm ~]# mkdir -p $HOME/.kube
[root@kubeadm ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kubeadm ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config


實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


coredns 處於 pending 狀態,所以現在需要部署一下容器的網絡,還是用 flannel,

[root@kubeadm ~]# wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml 
[root@kubeadm ~]# sed -i 's#quay.io/coreos/flannel:v0.11.0-amd64#swr.cn-north-1.myhuaweicloud.com/rj-bai/flannel:v0.11.0-amd64#g' kube-flannel.yml
[root@kubeadm ~]# kubectl apply -f kube-flannel.yml

網絡容器啟動後集群就算搭建完了,

[root@kubeadm ~]# kubectl get node
[root@kubeadm ~]# kubectl get pod -A


實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


然後看看一下證書的有效期,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


沒啥問題,下面把節點加進來。

節點加入集群

先在 master 看一下目前可用的 token

[root@kubeadm ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
wrf2ek.7ol2dgzajiqce1et 23h 2019-08-09T18:16:34+08:00 authentication,signing system:bootstrappers:kubeadm:default-node-token

加入集群的命名格式如下,

 kubeadm join : --token --discovery-token-ca-cert-hash sha256:

master-IP:port 不用說了,token 就是上面命令查到的那個,最後 sha256 也就是 ca 證書的 sha256,獲取命令如下,

[root@kubeadm ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
13f3ee2bb64a9c770896813fd5c0f0d93756a1020037c82e43c50375a4a0a742

所以我要在 node 節點執行這條,

[root@node-1 ~]$ kubeadm join 192.168.1.143:6443 --token wrf2ek.7ol2dgzajiqce1et \
> --discovery-token-ca-cert-hash sha256:13f3ee2bb64a9c770896813fd5c0f0d93756a1020037c82e43c50375a4a0a742

執行後 node 也會進行一定的初始化工作,會啟動一個 flannel&kube-proxy 容器,在 master 等著就行了,一會 node 就會變為 Ready,

[root@kubeadm ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
kubeadm Ready master 17m v1.15.2
node-1 Ready 3m18s v1.15.2

最後測試一波吧,到底能不能用,還是跑個 nginx 試試,

[root@kubeadm ~]# kubectl run nginx --replicas=3 --image=nginx:latest --port=80
[root@kubeadm ~]# kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
[root@kubeadm ~]# kubectl get svc,pod -o wide


實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


訪問試試,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


再測一下 coredns,

[root@kubeadm ~]# kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh
/ # nslookup kubernetes


實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


能查到,最後確認一下 kube-proxy 用的是不 IPVS 模式,看一下 kube-proxy 的日誌就知道了,

實踐操作:在kubeadm快速部署kubernetes 1.15.2 集群


就這樣,沒啥子問題,結束。

原文來自:
https://blog.rj-bai.com/post/160.html本文地址:
https://www.linuxprobe.com/?p=158495編輯:吳向平,審核員:逄增寶Linux命令大全:
https://www.linuxcool.com/


分享到:


相關文章: