三、kubeadm初始化Kubernetes集羣

同步時間

# ntpdate time.nist.gov

k8s集羣組成

k8s部署環境 

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#prerequisites

01 安裝方式

關於安裝方式,目前除去雲服務商自己提供的K8S集羣服務, 本地集羣安裝方式主要有3種:html

  • 基於二進制的安裝方式
  • 基於官方工具kubeadm的安裝方式
  • 基於第三方工具的安裝

一、基於yum直接將相關組件部署爲系統級守護進程,缺點:controller-manager故障,須要手動重啓;node

節點網絡:192.168.0.0/16linux

Pod網絡地址:10.244.0.0/16git

Service網絡地址:10.96.0.0/12   //掩碼是12位的github

etcd部署在master節點上,不獨立;docker

二、使用kubeadm進行部署,將k8s的核心組件部署爲pod,但須要在master和node上手動部署kubelet和docker(docker是運行容器的引擎,kubelet是運行pod化的容器的核心組件);json

使用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自身管理),vim

k8s在github上的地址:https://github.com/kubernetescentos

 

kubeadm初始化並安裝、生成k8s集羣的過程  

https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

kubeadm初始化、安裝集羣的步驟:api

一、master、nodes:安裝kubelet、kubeadm、docker

二、master:kubeadm init  //在master運行kubeadm init,初始化集羣

三、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/

一、首先部署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   //能夠看出已經指向阿里雲的倉庫連接了

 

二、配置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

三、初始化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/

四、在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   //在此進行安裝

五、初始化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://blog.csdn.net/jinguangliu/article/details/82792617

http://www.javashuo.com/article/p-nkgyjeuq-ev.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

 

解決上述問題後再次執行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 //若是管理員執行上述兩個操做,此步就取消

[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

# 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節點

一、首先將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/

二、安裝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節點

一、首先複製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/

二、在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

三、拉取鏡像

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

四、初始化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

相關文章
相關標籤/搜索