寫在前面的話node
經過上一節,知道了 K8S 有 Master / Node 組成,可是具體怎麼個組成法,就是這一節具體談的內容。概念性的東西咱們會盡可能以實驗的形式將其復現。linux
部署 K8S 集羣git
互聯網經常使用的 K8S 集羣部署方式:github
1. kubeadm(咱們本次用到的)docker
2. rancherjson
3. 雲服務商提供的(如阿里雲提供的 K8S)centos
4. yum 安裝(版本有點低,不推薦)api
準備:bash
IP | 主機名 | 角色 | 安裝 |
---|---|---|---|
192.168.100.101 | node1 | Master | kubeadm/kubelet/kubectl/docker-ce/flannel |
192.168.100.102 | node2 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
192.168.100.103 | node3 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
準備 3 臺初始化的機器,內存大於 2G。網絡
至於 kubeadm 文檔以下,感興趣的能夠去看看:
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
【1】全部節點初始化操做:
# 配置主機名解析 echo "192.168.100.101 node1" >>/etc/hosts echo "192.168.100.102 node2" >>/etc/hosts echo "192.168.100.103 node3" >>/etc/hosts # 關閉防火牆 systemctl stop firewalld systemctl disable firewalld # 取消 swap swapoff -a # 配置 ipvs echo 'net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1' > /etc/sysctl.d/k8s.conf # 使配置生效 modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf # kube-proxy 配置 ipvs echo 'modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4' >> /etc/sysconfig/modules/ipvs.modules # 生效配置 chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv4 # 時間同步 yum -y install ntpdate ntpdate cn.pool.ntp.org echo "*/20 * * * * /usr/sbin/ntpdate cn.pool.ntp.org" >> /var/spool/cron/root
簡單的作個說明,上面的步驟是每一個節點都須要進行的初始化操做,屬於必須進行了。第一個主機名解析須要根據本身的實際狀況進行必定量的修改。關閉防火牆是爲了保證咱們的通訊可以正常完成。至於開啓 ipvs 咱們在上一節提到過,在 K8S 1.11 版本之後,系統的負載均衡調度選用的是 ipvs 規則,可以提升咱們集羣的性能。若是你不配置 ipvs,可能還會使用 iptables 規則,這不是咱們想要看到的。
值得注意的是,時間同步在 docker 和 K8S 集羣中都特別重要,因此必定要保證時間與互聯網時間同步,不然可能致使莫名其妙的 BUG,如:鏡像拉取失敗,報錯:
x509: certificate has expired or is not yet valid
【2】全部節點都安裝配置 docker:
# 卸載舊版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安裝依賴 yum install -y yum-utils device-mapper-persistent-data lvm2 bridge-utils bash-completion wget # 配置阿里 yum 源 cd /etc/yum.repos.d wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安裝 docker yum -y install docker-ce
配置 docker 阿里雲下載加速:(這裏的加速地址是網友的,若是你想用本身的,能夠去阿里雲搞一個,具體就不詳細說明了,網上不少)
mkdir -p /etc/docker echo '{ "registry-mirrors": ["https://eyg9yi6d.mirror.aliyuncs.com"] }' > /etc/docker/daemon.json
啓動 docker:
systemctl enable docker
systemctl start docker
docker version
我這裏 docker 版本爲: 18.09.6
【3】全部節點都配置 K8S 源並安裝 K8S:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安裝 K8S 並設置開機啓動,可是先不啓動:
yum makecache fast yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
咱們這裏安裝 K8S 版本爲:v1.14.2
【4】節點下載鏡像:
因爲國內網絡的緣由,K8S 的鏡像站是鏈接不上的,須要手動去下載,這裏有個我寫的腳本,修改爲你的 K8S 版本就行(K8S_VERSION):
#!/bin/bash ################################################################# # 做者:Dy1an <1214966109@qq.com> # 日期:2019-05-23 # 做用:下載 K8S 相關鏡像 ################################################################# ################################################################# # 系統相關變量 ################################################################# LINE="===================================================================" MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings K8S_VERSION="v1.14.2" ################################################################# # 拉取鏡像 ################################################################# echo ${LINE} echo "Pull Kubernetes ${K8S_VERSION} Images from aliyuncs.com ......" echo ${LINE} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 ################################################################# # 修改 tag ################################################################# echo ${LINE} echo "Change Kubernetes ${K8S_VERSION} Images tags ......" echo ${LINE} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} k8s.gcr.io/kube-apiserver:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} k8s.gcr.io/kube-scheduler:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} k8s.gcr.io/kube-controller-manager:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} k8s.gcr.io/kube-proxy:${K8S_VERSION} docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 k8s.gcr.io/pause:3.1 docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 ################################################################# # 提示完成 ################################################################# echo ${LINE} echo "Pull Kubernetes ${K8S_VERSION} Images FINISHED." echo ${LINE}
在每臺機器上面執行腳本,下載完成後查看鏡像:
docker images
結果如圖:
【5】Master 主節點初始化:
在初始化以前,咱們須要插播一個知識點,那就是 K8S 網絡,先看個圖:
在 K8S 集羣中,咱們主要會提到 3 個網絡:
1. 節點網絡:很好理解,就是每臺機器的真實 IP 地址,好比:192.168.100.101,該 IP 稱做 Node IP。
2. Pod 網絡:K8S 管理的最小單位是 Pod,咱們能夠把 Pod 就當作一個 docker 容器,這個 IP 就像容器的 IP,稱做 Pod IP。
3. Service 網絡:前兩 IP 都會配置到 Pod 或網卡,可是這個不會,若多個 Pod 組成一個 Service,這個 IP 就像統一入口。至於 Service,以後會詳講。該 IP 稱做 Cluster IP。
固然還有其餘網絡,好比 pod 和 pod 之間通訊的隧道 Overlay(疊加)網絡。以及 Pod 內部容器間經過 lo 網卡通訊的網絡。這些都不須要咱們去關注。只須要記住上面的 3 個就行。
爲了實現這樣複雜的網絡結構,咱們引入了網絡插件,常見的插件有如下幾種:
1. flannel:簡單易用,但不支持網絡策略。經過配置本地網絡協議棧實現給本機 Pod 配置 IP。
2. project calico:支持網絡策略和網絡配置,默認基於 BGP 網絡實現直接通訊。
3. canel:flannel 和 calico 結合,flannel 提供網絡,calico 提供策略。
基於上面的知識點,咱們再來初始化咱們的集羣,並定義了兩個服務網段:
# 添加配置 echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet # 初始化主節點 kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.1.0.0/16 --service-cidr=10.96.0.0/12
結果如圖:
從初始化節點打印的東西咱們能夠看到:
1. 系統初始化安裝了兩個附件:kube-proxy 和 CoreDNS(就是 kube-dns)。
2. 咱們須要手動執行這個 3 個命令纔算真正完成主節點初始化。
3. Node 節點加入集羣的命令,須要咱們記錄下來。
執行後續操做:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集羣狀態:
kubectl get cs
結果如圖:
查看節點信息:
kubectl get nodes
結果如圖:
此時能夠看到,主節點的狀態是 NotReady 的,緣由是尚未配置 flannel。
注意:若是出現錯誤,咱們能夠經過 /var/log/messages 查看日誌。
安裝 flannel 網絡插件,項目地址:
https://github.com/coreos/flannel
執行命令在線安裝:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
結果如圖:
此時再度查看節點狀態:
kubectl get nodes
結果如圖,已經變成 Ready 狀態:
查看當前運行的 Pod:
kubectl get pods -n kube-system
結果如圖:
這裏專門指定了名稱空間,若是不指定,會發現默認的名稱空間中什麼也沒有。能夠查看下名稱空間:
kubectl get ns
結果如圖:
至此,主節點配置基本完成,接下來配置 Node 節點!至於這些命令,以後會單獨講解。
【6】Node 節點初始化:
# 添加配置 echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet # 加入集羣 kubeadm join 192.168.100.101:6443 --token no4hr8.4xv9xjyt9dxwqinq --discovery-token-ca-cert-hash sha256:239675f2ccb9e700ea1a60b8ff019672ea1a98c1f66ad6a81972cb5ec7d4f381
結果如圖:
去主節點查看結果:容器啓動須要必定的時間(1-2分鐘),因此直接查看可能出現 NotReady 的狀況,這是正常的。
主節點上查看運行的詳細信息:
kubectl get pods -n kube-system -o wide
結果如圖:-o wide 查看詳細信息!
能夠看到,kube-proxy 和 kube-flannel 在其餘節點上都有運行。
這裏咱們得再強調一件事情,除了開始加入節點的命令咱們得去 Node 從節點執行,後續的命令咱們都是在 Master 節點完成的,由此能夠看出 Master 節點的重要性。
到此,K8S 簡單的集羣搭建完成!
小結
整個部署過程當中最麻煩的就是鏡像下載以及鏡像版本之間的兼容性。咱們推薦使用相對成熟的版本部署咱們的應用。由於我這裏是測試,因此就選用的最新穩定版。
主要的過程就像這些,看着很複雜,其實大多都說貼命令的過程。後續若是感興趣,其實徹底能夠寫成腳本,讓他一鍵部署。