CentOS上安裝Kubernetes集羣

說了好久的容器計劃,如今終於有時間實際操做下了,前期學習有很些概念,雖然有Rancher OS和CoreOS這類的發行版,但Kubernetes集羣的安裝也不是太麻煩,所以,仍是先從最基本的實驗下。如下是本人CentOS7.6上安裝Kubernetes集羣的筆記,持續更新...。node

Kubernetes主機環境預設

Kubernete集羣的主機生產環境也有多種選擇,以下:python

  • 方案一: 三臺或者五臺 Master 節點,分別安裝全角色:ETCD , Control Plane ;其餘節點爲容器計算機節點,分別安裝角色: worker;
  • 方案二: 三臺節點分別安裝角色:ETCD;兩臺節點分別安裝角色:Control Plane;其餘節點爲容器計算機節點,分別安裝角色: worker;

但我如今手上只有一臺7代i7的筆記本,雖有16G內存,但這雙核四線程真不夠看啊,單機和minikube安裝先不考慮,等小型實驗集羣實驗好後再逐個實現。個人筆記本是安裝的fedora,使用kvm虛擬機虛擬了三個主機每一個主機也就1vcpu+1G內存,分別安裝一個master節點和兩個計算節點。
各個節點須要安裝的kubernetes組件以下:linux

  • 主節點:
    • kube-apiserver
    • kube-controller-manager
    • kube-scheduler
    • kube-proxy
    • pause
    • etcd
    • coredns
  • 從節點:
    • kube-proxy
    • pause
    • flannel(本次實驗選定的網絡插件)

設置時間同步

如chrony,配置文件/etc/chrony.conf(內網須要配置時間服務器),服務啓動使用systemctl命令。建議不管內網和能鏈接Internet的環境都爲集羣配置時間同步服務器。git

配置DNS或者hosts主機解析

在/etc/hosts文件中配置集羣的IP和主機名解析(同時能夠減小DNS的解析時延)github

關閉防火牆

CentOS7上關閉防火牆docker

# systemctl stop firewalld.service

# systemctl disable firewalld.service

關閉SELinux

# setenforce 0

同時配置時/etc/selinux/config文件json

# vim /etc/selinux/config
...
SELINUX=disable

或者vim

# sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux

禁用swap設備

Kubernetes 1.8 開始須要關閉系統 Swap 交換分區,若是不關閉,則沒法啓動。
查看centos

# free -m

臨時生效api

# sysctl -w vm.swappiness=0

永久生效(儘可能不使用交換分區,注意不是禁用)

# echo "vm.swappiness = 0">> /etc/sysctl.conf

刷新SWAP(將SWAP裏的數據轉儲回內存,並清空SWAP裏的數據)

swapoff -a && swapon -a

生效操做配置不重啓

sysctl -p

或者使用以下方法:
關閉臨時

# swapoff -a
# echo "vm.swappiness = 0" >> /etc/sysctl.conf

或者

# swapoff -a && sysctl -w vm.swappiness=0

同時編輯配置文件/etc/fstab進行永久關閉,即註釋掛載swap設備的行(不推薦)。

注:本次實驗因爲資源有限沒有關閉,但後續有解決方法(僅限於實驗環境)

啓用IPVS內核模塊

kube-proxy 支持 iptables 和 ipvs,若是條件知足,默認使用 ipvs,不然使用 iptables。

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

因爲 ipvs 已經加入到了內核的主幹,因此爲 kube-proxy 開啓 ipvs 的前提須要加載如下的內核模塊:

  • ip_vs
  • ip_vs_rr
  • ip_vs_wrr
  • ip_vs_sh
  • nf_conntrack_ipv4

執行如下腳本加載內核

實現方式1

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

實現方式2

vim /etc/sysconfig/modules/ipvs.modules

#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
    /sbin/modinfo -F filename $i &> /dev/null
    if [ $? -eq 0 ]; then
        /sbin/modprobe $i
    fi
done

# chmod +x /etc/sysconfig/modules/ipvs.modules
# bash /etc/sysconfig/modules/ipvs.modules

上面腳本建立了的/etc/sysconfig/modules/ipvs.modules文件,保證在節點重啓後能自動加載所需模塊。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已經正確加載所需的內核模塊。

接下來還須要確保各個節點上已經安裝了 ipset 軟件包。 爲了便於查看 ipvs 的代理規則,最好安裝一下管理工具 ipvsadm。

yum install ipset ipvsadm

若是以上前提條件若是不知足,則即便 kube-proxy 的配置開啓了 ipvs 模式,也會退回到 iptables 模式。
建立內核模塊加載腳本於目錄/etc/sysconfig/modules下。

安裝程序包

採用docker做爲容器運行

配置運行Docker

  • 安裝必要的一些系統工具
# yum install -y yum-utils device-mapper-persistent-data lvm2
  • 添加docker源
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

能夠採用國內的鏡像加速服務,參照kubernetes的官方文檔,這裏使用阿里的鏡像在CentOS上的安裝做爲說明(做此筆記的時候嘗試過華爲、騰訊和電子科大的kubernetes好像版本沒有阿里的新,就暫時先用阿里的來作實驗了)。

  • 更新並安裝 Docker-CE
# yum makecache fast
# yum -y install docker-ce

此處根據默認是docker源文件的配置安裝的是最新穩定版,但頗有可能不能經過最新的kubernetes的認證。所以,咱們採用下面的方式來選擇安裝版本,特別是再生產環境中。
首先是查找倉庫中的版本:

# yum list docker-ce.x86_64 --showduplicates | sort -r
Loading mirror speeds from cached hostfile
Loaded plugins: branch, fastestmirror, langpacks
...
dockdr-ce.x86_64            18.09.9.ce-1.el7.centos            docker-ce-stable
...
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
Available Packages

而後安裝指定版本的Docker-CE: (VERSION 例如上面的 18.09.9.ce.1-1.el7.centos)

# yum -y install docker-ce-18.09.9 docker-ce-cli-18.09.9

若是是離線安裝可使用Everthing的哪一個ISO進行依賴庫的安裝,但安裝的docker版本比較老,不過問題也不大。固然也能夠先在可以聯網的主機上將須要的rpm打包下載,而後拷貝到離線環境中進行安裝,關鍵過程以下:
使用yum命令下載離線包

# yum install docker-ce-18.09.9 docker-ce-cli-19.09.9 --downloadonly --downloaddir=/home/<your_account>/

在離線環境中安裝(按照以下順序進行安裝)
1)安裝基礎的依賴包

# rpm -ivh checkpolicy-2.5-8.el7.x86_64.rpm
# rpm -ivh libcgroup-0.41-20.el7.x86_64.rpm
# rpm -ivh libseccomp-2.3.1-3.el7.x86_64.rpm
# rpm -ivh libsemanage-python-2.5-14.el7.x86_64.rpm
# rpm -ivh audit-libs-python-2.8.4-4.el7.x86_64.rpm
# rpm -ivh setools-libs-3.3.8-4.el7.x86_64.rpm
# rpm -ivh python-IPy-0.75-6.el7.noarch.rpm
# rpm -ivh policycoreutils-python-2.5-29.el7.x86_64.rpm

2)安裝docker-ce的軟件包

# rpm -ivh container-selinux-2.99-1.el7_6.noarch.rpm
# rpm -ivh containerd.io-1.2.6-3.3.el7.x86_64.rpm
# rpm -ivh docker-ce-cli-18.09.7-3.el7.x86_64.rpm
# rpm -ivh docker-ce-18.09.7-3.el7.x86_64.rpm

說明:
1.上述安裝的軟件包版本可能不同,根據安裝時的具體實際狀況來,沒必要臺糾結。
2.在掛載Eerything的ISO做爲軟件源的狀況下,能夠直接使用yum命令對拷貝到本地的container-selinux、containerd.io、docker-ce-cli、docker-ce的軟件包,安裝上述順序進行安裝。

  • 開啓Docker服務
# systemctl start docker
# systemctl enable docker
  • 其它官方文檔設置
    建立目錄‘/etc/docker’
    # mkdir /etc/docker

    建立daemon

    # 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

建立服務目錄(官方文檔,還不知道幹什麼用)

# mkdir -p /etc/systemd/system/docker.service.d

修改docker服務文件(/usr/lib/systemd/system/docker.service),docker的iptables的FORWARD默認策略爲DROP,可能會影響集羣通訊,須要修改原有的docker.service文件,在"ExecStart=/usr/bin/docker"以後新增一行:

ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

重啓Docker服務

# systemctl daemon-reload
# systemctl restart docker

添加配置文件k8s.conf

# vim /etc/sysctl.d/99-kubernetes-cri.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

生效99-kubernetes-cri.conf

# sysctl --system

配置運行Kubernets

生成kubernets的倉庫配置文件

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

安裝kubeadm、kubelet、kubectl

# yum install kubeadm kubelet kubectl

(可選)拉取初始化所需組件

在初始化命令以前運行鏡像拉取命令獲取所需組件,同時觀察鏡像文件的下載過程。

# kubeadm config images pull

若是沒有改倉庫則默認從k8s.gcr.io去獲取,國內環境時獲取不到,所以採用一個變通的方法

# vim k8s-pull-images.sh

#!/bin/bash
REGISTRY=gcr.azk8s.cn/google-containers
# REGISTRY=mirrorgooglecontainers

images=(
  kube-apiserver:v1.15.3
  kube-controller-manager:v1.15.3
  kube-scheduler:v1.15.3
  kube-proxy:v1.15.3
  pause:3.1
  etcd:3.3.10
  coredns:1.3.1
)

for imageName in ${images[@]} ; do
  docker pull ${REGISTRY}/$imageName  
  docker tag ${REGISTRY}/$imageName k8s.gcr.io/$imageName  
  docker rmi ${REGISTRY}/$imageName
done

其中組件包列表能夠經過命令"kubeadm config images list"獲取。

# chmod +x k8s-pull-images.sh
# ./k8s-pull-images.sh

上述腳本保存執行後能夠經過"docker image list"查看結果。

kubeadm初始化master節點

初始化命令‘kubeadm’可使用參數傳遞和yaml配置文件,測試實驗推薦第一種,生產部署推薦第二種。

命令行參數進行初始化

# kubeadm init --kubernetes-version="1.15.3" --pod-network-cidr="10.244.0.0/16"  --service-cidr="10.96.0.0/12" --ignore-preflight-errors=Swap --ignore-preflight-errors=NumCPU --image-reporitory "gcr.azk8s.cn" --dry-run

其中

  • --kubernete-version="1.15.3"指定了kubernete的具體版本,默認的「stable-1」,這裏是1.15.0,不符合規定須要修改爲當前的版本,此處時1.15.3(查詢命令"rpm -qa|grep kubeadm")。
  • --pod-network-cidr="10.244.0.0/16"是自定義的Pod的網絡,一般與要部署的網絡插件(如:flannel和calico)保持一致,此處使用的時flannel,flannel的默認地址爲:10.244.0.0/16,calico的默認地址爲:192.168.0.0/16。
  • --ignore-preflight-errors=,這裏有兩項一個是Swap,一個是NumCPU,他們分別忽略了swap不爲0的報錯和CPU沒有大於2的報錯。由於這裏我用的是虛擬機,只有1G的內存,所以沒有關閉swap;同時虛擬機之分配了一個vCPU。若未禁用swap,則須要編輯kubelet的配置文件/etc/sysconfig/kubelet,忽略swap啓用狀態錯誤。
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  • --server-cidr指定service分配的網絡地址,由kubernete管理,默認地址爲10.96.0.0/12。
  • --image-reporitory指定組件倉庫地址代替默認的"k8s.gcr.io",好比此處國內的gcr.azk8s.cn。
  • --dry-run 只是試運行看有沒有什麼錯誤,並無實際初始化。

最後顯示初始化結果

...
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.122.10:6443 --token kt9uzn.793zkkepgvup3jg8 \
    --discovery-token-ca-cert-hash sha256:1b00c8c653c5573ff89c134bd1e62a54f3640813b0e26b79f387fddb402b0b48

接下來按照上述初始化結果的提示,建立文件夾(此處用的時root用戶)

# mkdir -p ~/.kube
# cp /etc/kubernetes/admin.conf ~/.kube/config

而後安裝網絡插件,語法:"kubectl apply -f [podnetwork].yaml",此處咱們使用的flannel(由coreos研發)。在github的頁面上有具體的安裝說明,地址https://github.com/coreos/flannel。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

然後可使用命令"kubectl get pods -n kube-system"進行查看。

注:

  1. 若是初始化有問題或者要回退使用下面的命令進行重置

    # kubeadm reset
  2. kubeadm init的命令執行過程當中有下載,可使用上面的kubeadm config image pull先把須要的組件包先行下載。

  3. kubeadm初始化時部分告警報錯說明
  • kubernete承認的docker版本問題
[WARNING SystemVerification]: this docker version is not on the list of validated version: 19.01.1. Latest validated version: 18.06

以上版本根據自身環境的報告版本有所不一樣,能夠參看kubernetes在git倉庫中的changelog文件來肯定支持的docker本版,而後根據命令

# yum list docker-ce.x86_64 --showduplicates | sort -r

獲取版本列表,而後選取特定的版本進行安裝

sudo yum -y install docker-ce-[VERSION]
  • kubelet沒有設置自啓動
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'

解決:執行自啓動命令'systemctl enable kubelet.service'

報錯說明

  • 沒有禁用swap:
[ERROR Swap]: running with swap on is not enabled, please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with '--ignore-preflight-errors=...'

解決:能夠在kubeadm的命令末尾加上參數'--ignore-preflight-errors=Swap'。

經過配置文件進行初始化

經過命令查看默認配置

# kubeadm config print init-defaults

能夠調整kubeProxy的模式爲ipvs

kubeProxy:
  config:
    mode: "ipvs"
    ipvs:
      ExcludeCIDRs: null
        minSyncPeriod: 0s
        scheduler: ""
        syncPeriod: 30s
...

同時能夠修改imageRepository更改獲取鏡像時使用的倉庫

初始化計算節點

計算結點的初始化和主節點相似,執行相同的命令,在安裝完kubeadm和kubelet後,設置kubelet服務自啓動"systemctl enable kubelet",而後執行主節點初始化後的的提示命令加入機羣

# kubeadm join 192.168.122.10:6443 --token i75tol.nbptvcjp8x8yx2lo \
    --discovery-token-ca-cert-hash sha256:eeb70912425f575b47d9b0a2830feb18b7d1ef2807bf454656b2903f04cc472c

若是時測試的虛擬機請注意錯誤和告警提示,如swap禁用問題,須要在上面的命令後加上"--ignore-preflight-errors=Swap"。成功執行後結果會有以下的相似顯示:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

加入的過程可能須要點時間,由於加入的節點須要從主節點中拉取所須要的鏡像,使用命令"docker image list"能夠查看已有組件。

在獲取kubernete組件時能夠直接使用已下載打包的tar文件直接加載
語法爲

docker save -o <path for generated tar file> <image name></image>

在注節點上查看kubernetes的docker鏡像命令:docker image list
在主節點上打包計算節點須要的組件

# docker save -o /home/myk8s-1.15.3.tar docker save -o myk8s-node-1.15.3.tar k8s.gcr.io/pause k8s.gcr.io/kube-proxy quay.io/coreos/flannel

拷貝到計算結點,加載鏡像

docker load -i <your_tar_file>

而後再執行加入集羣的命令。另外,還有docker export/import

  • docker export 導出容器爲壓縮文件,命令格式以下:
    # docker export -o <path for generated tar file> <container name>

    相似於docker save,指定要輸出的文件路徑和文件名,後面跟上要導出的容器的名稱或者id。

  • docker import 把導出的文件系統導入爲鏡像,命令格式以下:
    # docker import <tar file> <container name>

.kube下文件admin.conf才能執行kubectl命令

相關文章
相關標籤/搜索