同步時間
# ntpdate time.nist.gov
k8s集群組成
k8s部署環境
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#prerequisites
01 安裝方式
關於安裝方式,目前除去雲服務商本身提供的K8S集群服務, 本地集群安裝方式主要有3種:
- 基於二進制的安裝方式
- 基於官方工具kubeadm的安裝方式
- 基於第三方工具的安裝
1、基於yum直接將相關組件部署為系統級守護進程,缺點:controller-manager故障,需要手動重啟;
節點網絡:192.168.0.0/16
Pod網絡地址:10.244.0.0/16
Service網絡地址:10.96.0.0/12 //掩碼是12位的
etcd部署在master節點上,不獨立;
2、使用kubeadm進行部署,將k8s的核心組件部署為pod,但需要在master和node上手動部署kubelet和docker(docker是運行容器的引擎,kubelet是運行pod化的容器的核心組件);
使用kubeadm進行部署,每一個節點都需要作為k8s底層的docker運行的節點,即包括master都需要安裝docker,同時每一個節點都需要安裝、運行kubelet、docker,並且確保這兩者啟動並運行。把第一個節點初始化為master,把其他節點初始化為node。將master上的組件API Server、etcd、controller-manager、scheduler都運行為pod(都是靜態pod,不受k8s管理,只是運行為pod的形式),即都跑在kubelet之上,以容器化的形式運行(k8s自己的組件都運行為pod)。node上將kube-proxy運行為Pod。每一個節點包括master都需要以pod運行flannel(動態pod,由k8s自身管理),
k8s在github上的地址:https://github.com/kubernetes
kubeadm初始化並安裝、生成k8s集群的過程
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
kubeadm初始化、安裝集群的步驟:
1、master、nodes:安裝kubelet、kubeadm、docker
2、master:kubeadm init //在master運行kubeadm init,初始化集群
3、nodes:kubeadm join //在各nodes節點執行kubeadm join,將節點加入到集群中去
安裝實踐
部署環境
master:IP:192.168.184.141 主機名:master
node1: IP:192.168.184.142 主機名:node01
node2: IP:192.168.184.143 主機名:node02
鏈接地址:https://github.com/kubernetes/kubernetes/releases?after=v1.13.0-alpha.0
將master和node節點分開下載(注意這是第一種安裝方式,即將k8s的組件以系統級守護進程來運行)
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1111
注意:無論是master還是node,用到的都是server端的安裝包,由於在服務器本地也要執行一些客戶端的命令,所以也需要將客戶端的安裝包下載下來。
下面以第二種安裝方式,即kubeadm安裝k8s,這里使用阿里雲利用yum進行安裝
注意:iptables和firewalld一定不能啟用,因為在安裝k8s時會大量操作iptables規則
阿里雲鏡像鏈接 https://mirrors.aliyun.com/kubernetes/
1、首先部署docker的yum倉庫 https://mirrors.aliyun.com/docker-ce/linux/centos/
master ~]# cd /etc/yum.repos.d/
master yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
master yum.repos.d]# vim docker-ce.repo //可以看出已經指向阿里雲的倉庫鏈接了
2、配置k8s的yum倉庫
master ~]# cd /etc/yum.repos.d/
master yum.repos.d]# vim kubernets.repo
1 [kubernetes] 2 name=Kubernetes Repo 3 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 4 gpgcheck=1 5 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 6 enabled=1
3、初始化k8s和docker的yum倉庫
master yum.repos.d]# yum repolist
將k8s和docker的yum倉庫發送至node01和node02節點
master yum.repos.d]# scp kubernets.repo docker-ce.repo node01:/etc/yum.repos.d/
master yum.repos.d]# scp kubernets.repo docker-ce.repo node02:/etc/yum.repos.d/
4、在master上安裝docker和k8s
master yum.repos.d]# yum install docker-ce kubelet kubeadm kubectl //kubectl是API Server的命令行客戶端
在安裝過程出現k8s無gpg-key的問題,就手動導入
master yum.repos.d]# vim kubernets.repo //將gpgcheck=0
master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg //下載yum檢查密鑰,注意路徑
master ~]# rpm --import yum-key.gpg //導入密鑰
master ~]# yum install docker-ce kubelet kubeadm kubectl //在此進行安裝
5、初始化docker和k8s並啟動
docker需要到docker倉庫中下載所依賴的每一個鏡像文件,這些鏡像文件有時可能是無法獲取的,所以可以利用其他方法加載鏡像文件再導入進來。由於kubeadm是支持直接使用本地當中已有的鏡像文件或者使用本地私有倉庫作為鏡像的下載路徑的。這里並不適用此方法,而是使用代理路徑來獲取並下載相關鏡像文件。
master ~]# vim /usr/lib/systemd/system/docker.service //修改此文件,定義一個環境變量
[Service]
Environment="HTTPS_PROXY=http://www.ik8s.io:10080" //在訪問https服務時,通過訪問代理來加載相關的鏡像文件,加載完之后可以把此行注釋掉
Environment="NO_PROXY=127.0.0.0/8,192.168.184.0/24" //此行表示不做代理
master ~]# systemctl daemon-reload
master ~]# systemctl start docker
master ~]# docker info
由於docker會大量生成iptables規則,可能需要打開bridge-nf-call-ip6tables和bridge-nf-call-iptables的橋接功能
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1 //確定這兩個參數都是1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
以上docker就設定成功
下面開始設定kubelet
master ~]# rpm -ql kubelet
/etc/kubernetes/manifests //清單目錄
/etc/sysconfig/kubelet //配置文件
/usr/bin/kubelet //主程序
/usr/lib/systemd/system/kubelet.service //unit file
master ~]# systemctl enable kubelet //先不要啟動kubelet,因為還沒有初始化完成
master ~]# kubeadm init --help //查看初始化選項
kubeadm初始化選項和命令:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
--apiserver-advertise-address string API Server將要廣播的監聽地址。如指定為 '0.0.0.0' 將使用缺省的網卡地址。 --apiserver-bind-port int32 缺省值: 6443 API Server綁定的端口 --apiserver-cert-extra-sans stringSlice 可選的額外提供的證書主題別名(SANs)用於指定API Server的服務器證書。可以是IP地址也可以是DNS名稱。 --cert-dir string 缺省值: "/etc/kubernetes/pki" 證書的存儲路徑。 --config string kubeadm配置文件的路徑。警告:配置文件的功能是實驗性的。 --cri-socket string 缺省值: "/var/run/dockershim.sock" 指明要連接的CRI socket文件 CoreDNS=true|false (缺省值=true) DynamicKubeletConfig=true|false (當前為BETA狀態 - 缺省值=false) -h, --help 獲取init命令的幫助信息 --ignore-preflight-errors stringSlice 忽視檢查項錯誤列表,列表中的每一個檢查項如發生錯誤將被展示輸出為警告,而非錯誤。 例如: 'IsPrivilegedUser,Swap'. 如填寫為 'all' 則將忽視所有的檢查項錯誤。 --kubernetes-version string 缺省值: "stable-1" 為control plane選擇一個特定的Kubernetes版本。 --node-name string 指定節點的名稱。 --pod-network-cidr string 指明pod網絡可以使用的IP地址段。 如果設置了這個參數,control plane將會為每一個節點自動分配CIDRs。 --service-cidr string 缺省值: "10.96.0.0/12" 為service的虛擬IP地址另外指定IP地址段 --service-dns-domain string 缺省值: "cluster.local" 為services另外指定域名, 例如: "myorg.internal". --skip-token-print 不打印出由 `kubeadm init` 命令生成的默認令牌。 --token string 這個令牌用於建立主從節點間的雙向受信鏈接。格式為 [a-z0-9]{6}\.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef --token-ttl duration 缺省值: 24h0m0s 令牌被自動刪除前的可用時長 (示例: 1s, 2m, 3h). 如果設置為 '0', 令牌將永不過期
獲取鏡像列表 https://www.cnblogs.com/peter1007/articles/9872491.html
master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1 //pause的作用是比如一個容器可以不用啟動,隨后其他容器啟動時可以加入復制這個容器的網絡和存儲卷,這個容器稱為基礎架構容器。
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
master ~]# kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16
master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
master ~]# kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16 --ignore-preflight-errors=Swap
但是出現了拉取鏡像失敗的問題,原因可能是無法訪問google的
cgroup驅動程序錯誤解決方法:https://kubernetes.io/docs/setup/cri/
cat > /etc/docker/daemon.json <<EOF { "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
關掉swap分區:https://blog.51cto.com/10950710/2373669
master ~]# swapoff -a
永久禁用swap分區:
注釋掉/etc/fstab文件中"/dev/mapper/centos-swap"這一行:
Kubernetes:如何解決從k8s.gcr.io拉取鏡像失敗問題:
https://www.cnblogs.com/climbsnail/p/12821799.html //重點參考
https://blog.csdn.net/jinguangliu/article/details/82792617
https://www.cnblogs.com/nb-blog/p/10636733.html
此方式是docker.io倉庫對google的容器做了鏡像,可以通過下列命令下拉取相關鏡像:
#docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.14.2 //先手動拉取鏡像
master ~]# docker pull coredns/coredns:1.3.1
根據安裝版本信息進行相應的修改。通過docker tag命令來修改鏡像的標簽:
#docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.14.2 k8s.gcr.io/kube-proxy-amd64:v1.14.2
上述拉取鏡像自動化:https://blog.51cto.com/nhylovezyh/2377982
重點參考:https://www.cnblogs.com/climbsnail/p/12821799.html
解決上述問題后再次執行master ~]# kubeadm init --kubernetes-version=v1.14.2...即可成功
此段代碼是需要用到
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea
master ~]# ss -tnl
問題:API Server沒有啟動,沒有監聽6443端口
The connection to the server 192.168.184.141:6443 was refused - did you specify the right host or port?
注意:如果服務器不小心重啟,kubelet無法重新啟動,解決方案:https://www.jianshu.com/p/39896f2e429d
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config //admin.conf是kubeadm自動初始化好的一個文件,它可以被kubectl拿來作為配置文件,指定連接至k8s的API Server並完成認證。
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config //如果管理員執行上述兩個操作,此步就取消
或者這樣配置 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> etc/profile souce etc/profile
[root@master ~]# kubectl get componentstatus //這里能正常顯示信息,說明API Server是正常的
[root@master ~]# kubectl get nodes //查看節點
NAME STATUS ROLES AGE VERSION
master NotReady master 7h12m v1.14.2
//NotReady此時master是未就緒狀態,因為缺少flannel或者Calico這樣的網絡組件
下面在master服務器上部署flannel網絡組件 https://github.com/coreos/flannel https://docs.projectcalico.org/v3.10/manifests/calico.yaml
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml //執行此命令,會自動在線獲取部署清單,並基於此清單下載鏡像,啟動並部署flannel
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.extensions/psp.flannel.unprivileged created 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
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 7h30m v1.14.2 //此時master已經ready狀態
[root@master ~]# kubectl get pods -n kube-system //kube-system是一個名稱空間
列表中顯示的是當前所有運行的pod,並且屬於kube-system名稱空間,如果不指明的名稱空間的話,那就屬於kubernetes集群默認的名稱空間,即defaults。
[root@master ~]# kubectl get ns //查看k8s集群的名稱空間
NAME STATUS AGE //四個名稱空間
default Active 7h41m
kube-node-lease Active 7h41m
kube-public Active 7h41m
kube-system Active 7h41m //系統級別的pod都在kube-system名稱空間中
以上master節點算是安裝完成,只要node節點安裝成功,更改docker文件(獲取鏡像文件),啟動docker並開機啟動docker和k8s,再設置kubelet swap文件,再初始化k8s集群(將node節點加入到集群中)就可以了。
master節點已經設置成功,下面就是指node01節點和node02節點
1、首先將master節點的yum倉庫復制到node01和node02
master ~]# scp yum-key.gpg node01:/root node01:/root
master ~]# scp /etc/yum.repos.d/kubernets.repo node01:/etc/yum.repos.d/
master ~]# scp /etc/yum.repos.d/docker-ce.repo node01:/etc/yum.repos.d/
2、安裝docker-ce和kubernetes
node1 ~]# rpm --import yum-key.gpg //首先導入yum密鑰文件
node1 ~]# yum install docker-ce kubelet kubeadm
node01(192.168.184.142)節點已經安裝成功,下面對node01節點進行初始化
首先設置docker.service文件,可以下載鏡像文件,但是這里不能訪問Google的鏡像文件,只能手動下載
master ~]# scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
master ~]# scp /etc/sysconfig/kubelet node01:/etc/sysconfig/
KUBELET_EXTRA_ARGS="--fail-swap-on=false" //文件中的內容
這里依然需要解決:cgroup驅動程序錯誤解決方法:https://kubernetes.io/docs/setup/cri/,前文已有敘述。
[root@node01 ~]# systemctl start docker
[root@node01 ~]# docker info
[root@node01 ~]# systemctl enable docker kubelet //開機啟動
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
node01 ~]# kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea --ignore-preflight-errors=Swap //初始化集群
此時需要等待node01節點需要下載kube_proxy鏡像和flannel鏡像,並啟動起來,node節點才算真正初始化完成。
在master節點可以查看到node01節點已經加進集群,但是沒有初始化完成
node01 ~]# docker pull quay.io/coreos/flannel:v0.11.0
node01 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
node01 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
node01 ~]# docker rmi mirrorgooglecontainers/kube-proxy:v1.14.2
node01 ~]# docker pull mirrorgooglecontainers/pause:3.1
node01 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
node01 ~]# docker rmi mirrorgooglecontainers/pause:3.1
准備node02節點
1、首先復制masetr節點上配置好的docker和k8s的yum倉庫文件
master ~]# scp yum-key.gpg node02:/root
master ~]# scp /etc/yum.repos.d/kubernets.repo node02:/etc/yum.repos.d/
master ~]# scp /etc/yum.repos.d/docker-ce.repo node02:/etc/yum.repos.d/
2、在node02節點安裝docker和k8s
node02 ~]# yum install docker-ce kubeadm kubelet
node02 ~]# vim /usr/lib/systemd/system/docker.service
Environment="NO_PROXY=127.0.0.1/8,192.168.184.0/24" //在文件中service段落中添加此行
node02 ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
cgroup驅動程序錯誤解決方法:https://kubernetes.io/docs/setup/cri/
node02 ~]# swapoff -a //關閉swap分區
node02 ~]# systemctl daemon-reload
node02 ~]# systemctl enable docker
node02 ~]# systemctl start docker
node02 ~]# systemctl enable kubelet
3、拉取鏡像
node02 ~]# docker pull quay.io/coreos/flannel:v0.11.0
node02 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
node02 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
node02 ~]# docker rmi mirrorgooglecontainers/kube-proxy:v1.14.2
node02 ~]# docker pull mirrorgooglecontainers/pause:3.1
node02 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
node02 ~]# docker rmi mirrorgooglecontainers/pause:3.1
4、初始化k8s集群
node02 ~]# kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea --ignore-preflight-errors=Swap //注意口令是會過期的,要注意更新
kubeadm 生成的token過期后,集群增加節點 https://www.jianshu.com/p/a5e379638577
master ~]# kubectl get pods -n kube-system -o wide