k8s爲何叫k8s呢?
由於k8s是Kubernetes的簡稱,由於K和S之間有8個字母,因此纔會被稱爲k8s。
k8s最初是在Google公司內部使用了10多年的技術,它的前身是叫作Borg(博格),直到2015年才被Google公司捐贈爲開源項目。node
若是以前咱們有接觸過OpenStack,那麼應該知道管理VM虛擬機資源能夠用OpenStack。那麼管理容器所對應的開源平臺是什麼呢?k8s就是其中之一,在k8s以前也有不少容器管理平臺,有docker自身的docker swarm,也有apache推出的Mesos等等。相比較而言,雖然k8s比其餘推出的晚了些,可是絲絕不影響其火爆程度,除了其功能強大外,更況且它還有個好爹。linux
關於k8s詳細介紹可參考k8s中文文檔git
1、環境準備github
主機名 | IP | 角色 | 基於服務 |
---|---|---|---|
docker-k8s01 | 192.168.171.151 | master | docker |
docker-k8s02 | 192.168.171.150 | node01 | docker |
docker-k8s03 | 192.168.171.152 | node02 | docker |
注:上述三臺centos 7.3服務器,均運行docker服務,若是是測試環境,那麼內存最少2G,CPU至少雙核,而且docker服務的版本不建議太高,最好是18.09及如下
.
部署docker服務可參考:部署 Docker docker
2、部署前準備工做
一、檢查docker版本、關閉防火牆及Selinux、清空iptables規則、禁用Swap交換分區shell
注:如下操做須要在三臺docker主機上分別配置一次,哪怕是在生產環境,都須要進行如下操做,由於k8s有它本身的安全策略apache
#查看當前docker版本 [root@docker-k8s01 ~]# docker -v Docker version 18.09.0, build 4d60db4 #關閉防火牆 [root@docker-k8s01 ~]# systemctl stop firewalld [root@docker-k8s01 ~]# systemctl disable firewalld #禁用selinux [root@docker-k8s01 ~]# setenforce 0 setenforce: SELinux is disabled [root@docker-k8s01 ~]# vim /etc/sysconfig/selinux SELINUX=disabled # 修改成disabled #清空iptables規則 [root@docker-k8s01 ~]# iptables -F #重啓docker服務 [root@docker-k8s01 ~]# systemctl daemon-reload [root@docker-k8s01 ~]# systemctl restart docker #禁用swap交換分區 [root@docker-k8s01 ~]# swapoff -a # 臨時禁用交換分區 [root@docker-k8s01 ~]# vim /etc/fstab # 編輯自動掛載的配置文件,將swap配置項註釋掉 #/dev/mapper/cl-swap swap swap defaults 0 0 [root@docker-k8s01 ~]# mount -a # 從新加載配置文件 [root@docker-k8s01 ~]# free -h # 查看分區信息,肯定swap行都爲0 total used free shared buff/cache available Mem: 1.8G 469M 841M 18M 508M 1.2G Swap: 0B 0B 0B
二、配置ssh免密登陸、主機名解析及yum源
在master主機上操做便可,配置文件可直接複製到兩臺nodevim
#配置ssh免密登陸(爲了方便在主機間複製配置文件,可忽略) [root@docker-k8s01 ~]# ssh-keygen -t rsa [root@docker-k8s01 ~]# ssh-copy-id docker-k8s02 [root@docker-k8s01 ~]# ssh-copy-id docker-k8s03 #配置域名解析 [root@docker-k8s01 ~]# tail -3 /etc/hosts 192.168.171.151 docker-k8s01 192.168.171.150 docker-k8s02 192.168.171.152 docker-k8s03 #將更改後的hosts文件發送到node01及node02 [root@docker-k8s01 ~]# scp /etc/hosts docker-k8s02:/etc/ [root@docker-k8s01 ~]# scp /etc/hosts docker-k8s03:/etc/ #配置k8s yum源,這裏配置的阿里雲的源,可上官網自行查看 [root@docker-k8s01 ~]# 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 #查看剛剛配置的yum源中有沒有可用的包 [root@docker-k8s01 ~]# yum repolist Loaded plugins: fastestmirror, langpacks kubernetes Kubernetes 551 # 返回的這一行不可爲0 [root@docker-k8s01 ~]# yum makecache # 製做yum源緩存 #將yum源的配置文件複製到另外兩臺節點主機上 [root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s02:/etc/yum.repos.d/ [root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s03:/etc/yum.repos.d/ #在另外兩臺主機上,都需執行如下兩條命令 [root@docker-k8s02 ~]# yum repolist kubernetes Kubernetes 551 # 切記這一行不可爲0 [root@docker-k8s02 ~]# yum makecache
三、打開iptables橋接功能及路由轉發
master上進行配置便可centos
#打開iptables橋接功能 [root@docker-k8s01 ~]# vim /etc/sysctl.d/k8s.conf # 寫入 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 [root@docker-k8s01 ~]# sysctl -p /etc/sysctl.d/k8s.conf # 刷新並加載配置 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 # PS:若是報錯「找不到文件」,須要執行下面的命令以便加載一個模塊。 [root@docker-k8s01 ~]# modprobe br_netfilter #加載br_netfileter模塊 #將k8s.conf文件複製到另外兩臺節點 [root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s02:/etc/sysctl.d/ [root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s03:/etc/sysctl.d/ #在兩臺node節點上也須要執行以下命令刷新配置 [root@docker-k8s02 ~]# sysctl -p /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 #開啓路由轉發(三臺docker主機上都須要進行如下操做) [root@docker-k8s01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf [root@docker-k8s01 ~]# sysctl -p net.ipv4.ip_forward = 1
初始化須要幾個鏡像文件,在初始化過程當中會自動下載,但要是網速慢的童鞋可能會很漫長,因此這裏提早準備了須要的軟件包(提取碼:1231),一會上傳上去導入便可
3、配置k8s羣集api
一、安裝部署k8s相關工具
注:如下操做在master主機上進行
#安裝k8s的master所需組件 [root@docker-k8s01 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0 kubectl-1.15.0-0 #將kubelet加入開機自啓,但不要如今啓動 [root@docker-k8s01 ~]# systemctl enable kubelet [root@docker-k8s01 ~]# mkdir images [root@docker-k8s01 ~]# cd images/ #將鏡像包上傳,共8個 [root@docker-k8s01 images]# ls coredns-1-3-1.tar kube-apiserver-1-15.tar kube-proxy-1-15.tar myflannel-11-0.tar etcd-3-3-10.tar kube-controller-1-15.tar kube-scheduler-1-15.tar pause-3-1.tar #接下來導入上傳的鏡像包到docker鏡像中 [root@docker-k8s01 ~]# pwd # 注:腳本不要和鏡像在同一個目錄 /root [root@docker-k8s01 ~]# vim images.sh # 鏡像比較多,寫個小腳本代勞下 #!/bin/bash cd /root/images/ for i in `ls` do docker load < ${i} done echo "導入完成" [root@docker-k8s01 ~]# sh images.sh # 執行腳本,進行導入鏡像
二、初始化k8s集羣
[root@docker-k8s01 ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap #這裏指定的版本必須和前面yum安裝的版本一致。指定的兩個網絡則是官方建議使用的網段 #若是執行上述命令後,返回CPU相關的報錯信息,那麼須要調大CPU的核心數 #初始化成功後,首先複製下面返回的這條命令,並妥善保存 #若初始化失敗,能夠執行kubeadm reset進行重置羣集 kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv \ --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711 #上面這條命令是用來其餘節點加入到當前k8s羣集中須要執行的 一旦丟失,特別麻煩,而且只有24小時有效期,每次初始化羣集後產生的都不同 #接下來呢,依次執行返回的其餘指令,以下(因爲我是root用戶,因此就省略了sudo指令) [root@docker-k8s01 ~]# mkdir -p $HOME/.kube [root@docker-k8s01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@docker-k8s01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
三、配置master節點狀態
[root@docker-k8s01 ~]# kubectl get nodes # 查看羣集節點信息 NAME STATUS ROLES AGE VERSION docker-k8s01 NotReady master 2m57s v1.15.0 #能夠看到master當前狀態爲未準備,不健康的
接下來能夠去github官網進行如下操做以便查看相應的命令
點擊進入後,下拉頁面到如下位置,並複製指定的命令到master節點執行一下
[root@docker-k8s01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在網絡情況良好的狀況下建議使用上述方法(調用遠端文件執行一下)
若網速較差,建議使用如下方法
#下載到本地 [root@docker-k8s01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #開頭連接中也有此文件可直接上傳使用 [root@docker-k8s01 ~]# ls | grep flannel.yml kube-flannel.yml [root@docker-k8s01 ~]# kubectl apply -f kube-flannel.yml # 指定下載的.yml文件執行相應命令
#再次查看羣集狀態,能夠看到master狀態已經變爲「ready」 [root@docker-k8s01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION docker-k8s01 Ready master 12m v1.15.0 [root@docker-k8s01 ~]# ls /etc/kubernetes/ # k8s的配置文件目錄 [root@docker-k8s01 ~]# ls /etc/kubernetes/manifests/ # k8s的.yaml文件存放目錄
四、配置node01及node02加入master羣集
#兩臺node節點都需執行以下操做 #安裝k8s相關組件 [root@docker-k8s02 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0 [root@docker-k8s02 ~]# systemctl enable kubelet # 設爲開機自啓,但不啓動 [root@docker-k8s02 ~]# mkdir images [root@docker-k8s02 ~]# cd images/ [root@docker-k8s02 images]# ls # 上傳以下三個鏡像包 kube-proxy-1-15.tar myflannel-11-0.tar pause-3-1.tar [root@docker-k8s02 images]# docker load < kube-proxy-1-15.tar [root@docker-k8s02 images]# docker load < myflannel-11-0.tar [root@docker-k8s02 images]# docker load < pause-3-1.tar [root@docker-k8s02 images]# kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711 # 執行master初始化羣集時返回的命令,以便加入到master的羣集中
兩臺node節點上配置完成後,再次在master上查看羣集信息
[root@docker-k8s01 ~]# kubectl get nodes # 在master上查看節點信息都爲「Ready」 NAME STATUS ROLES AGE VERSION docker-k8s01 Ready master 23m v1.15.0 docker-k8s02 Ready <none> 3m35s v1.15.0 docker-k8s03 NotReady <none> 4s v1.15.0
五、部署後的優化配置
爲了之後更爲方便的使用k8s,建議優化如下幾項:
- 設置table鍵的默認間距;
- 設置kubectl命令自動補全;
- 優化開機自啓配置。
1)設置table默認間距(該優化只需在master上進行配置便可,因爲常常須要編寫.yml文件因此才須要更改table間距)
[root@docker-k8s01 ~]# vim .vimrc # 將此參數寫入.vimrc文件 [root@docker-k8s01 ~]# bash # 切換shell環境使配置生效
2)設置kubectl命令自動補全(master和node節點均可配置)
[root@docker-k8s01 ~]# yum -y install bash-completion [root@docker-k8s01 ~]# source /usr/share/bash-completion/bash_completion [root@docker-k8s01 ~]# source <(kubectl completion bash) [root@docker-k8s01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
3)確認k8s羣集沒有問題,並設置爲開機自啓
master主機操做以下
[root@docker-k8s01 ~]# kubectl get pod -n kube-system #查看pod資源,相似於docker中的容器,確保返回的信息都是running #「-n kube-system」:是k8s的名稱空間
確保狀態都爲running
master和node節點上都須要進行如下操做,以便設置爲開機自啓
[root@docker-k8s01 ~]# systemctl enable kubelet [root@docker-k8s01 ~]# systemctl enable docker
設置爲開機自啓後,k8s羣集的配置基本完成了,如今能夠重啓一下這三臺服務器,若是重啓後,執行下面的命令,狀態都仍是running,則表示絕對沒有問題了