說了好久的容器計劃,如今終於有時間實際操做下了,前期學習有很些概念,雖然有Rancher OS和CoreOS這類的發行版,但Kubernetes集羣的安裝也不是太麻煩,所以,仍是先從最基本的實驗下。如下是本人CentOS7.6上安裝Kubernetes集羣的筆記,持續更新...。node
Kubernete集羣的主機生產環境也有多種選擇,以下:python
但我如今手上只有一臺7代i7的筆記本,雖有16G內存,但這雙核四線程真不夠看啊,單機和minikube安裝先不考慮,等小型實驗集羣實驗好後再逐個實現。個人筆記本是安裝的fedora,使用kvm虛擬機虛擬了三個主機每一個主機也就1vcpu+1G內存,分別安裝一個master節點和兩個計算節點。
各個節點須要安裝的kubernetes組件以下:linux
如chrony,配置文件/etc/chrony.conf(內網須要配置時間服務器),服務啓動使用systemctl命令。建議不管內網和能鏈接Internet的環境都爲集羣配置時間同步服務器。git
在/etc/hosts文件中配置集羣的IP和主機名解析(同時能夠減小DNS的解析時延)github
CentOS7上關閉防火牆docker
# systemctl stop firewalld.service # systemctl disable firewalld.service
# setenforce 0
同時配置時/etc/selinux/config文件json
# vim /etc/selinux/config ... SELINUX=disable
或者vim
# sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux
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設備的行(不推薦)。
注:本次實驗因爲資源有限沒有關閉,但後續有解決方法(僅限於實驗環境)
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 的前提須要加載如下的內核模塊:
執行如下腳本加載內核
實現方式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做爲容器運行
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
能夠採用國內的鏡像加速服務,參照kubernetes的官方文檔,這裏使用阿里的鏡像在CentOS上的安裝做爲說明(做此筆記的時候嘗試過華爲、騰訊和電子科大的kubernetes好像版本沒有阿里的新,就暫時先用阿里的來作實驗了)。
# 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的軟件包,安裝上述順序進行安裝。
# systemctl start docker # systemctl enable 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
# 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
# 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’可使用參數傳遞和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
其中
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
最後顯示初始化結果
... 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"進行查看。
注:
若是初始化有問題或者要回退使用下面的命令進行重置
# kubeadm reset
kubeadm init的命令執行過程當中有下載,可使用上面的kubeadm config image pull先把須要的組件包先行下載。
[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]
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
解決:執行自啓動命令'systemctl enable kubelet.service'
報錯說明
[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 -o <path for generated tar file> <container name>
相似於docker save,指定要輸出的文件路徑和文件名,後面跟上要導出的容器的名稱或者id。
# docker import <tar file> <container name>
.kube下文件admin.conf才能執行kubectl命令