003.Kubernetes二進制部署准備


一 安全策略

1.1 策略需求

相應的充足資源的Linux服務器;

設置相應的主機名,參考命令:hostnamectl set-hostname master01 ;

Mac及UUID唯一;

若未關閉防火牆則建議放通相應端口,如下:

  • Master節點
規則
方向
端口范圍
作用
使用者
TCP
Inbound
6443*
Kubernetes API server
All
TCP
Inbound
2379-2380
etcd server client API
kube-apiserver, etcd
TCP
Inbound
10250
Kubelet API
Self, Control plane
TCP
Inbound
10251
kube-scheduler
Self
TCP
Inbound
10252
kube-controller-manager
Self
TCP
Inbound
10257
kube-controller-manager
Self

其他更多前置准備見:https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

  • Worker 節點
規則
方向
端口范圍
作用
使用者
TCP
Inbound
80/443
ingress端口
All
TCP
Inbound
10250
Kubelet API
Self, Control plane
TCP
Inbound
30000-32767
NodePort Services**
All

二 主要組件

2.1 核心組件

  • etcd:保存了整個集群的狀態;
  • apiserver:提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API注冊和發現等機制;
  • controller manager:負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
  • scheduler:負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
  • kubelet:負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
  • Container runtime:負責鏡像管理以及Pod和容器的真正運行(CRI);
  • kube-proxy:負責為Service提供cluster內部的服務發現和負載均衡。

2.2 非核心組件

  • kube-dns:負責為整個集群提供DNS服務;
  • Ingress Controller:為服務提供外網入口;
  • metrics:提供資源監控;
  • Dashboard:提供GUI;
  • longhorn:Kubernetes的開源分布式塊存儲系統。

延伸1:對master節點服務組件的理解:

2018030821

Master節點上面主要由四個模塊組成:APIServer,schedule,controller-manager,etcd。
APIServer: APIServer負責對外提供RESTful的kubernetes API的服務,它是系統管理指令的統一接口,任何對資源的增刪該查都要交給APIServer處理后再交給etcd,如架構圖中所示,kubectl(Kubernetes提供的客戶端工具,該工具內部就是對Kubernetes API的調用)是直接和APIServer交互的。

schedule: schedule負責調度Pod到合適的Node上,如果把scheduler看成一個黑匣子,那么它的輸入是pod和由多個Node組成的列表,輸出是Pod和一個Node的綁定,即將這個pod部署到這個Node上。Kubernetes目前提供了調度算法,但是同樣也保留了接口,用戶可以根據自己的需求定義自己的調度算法。

controller manager: 如果APIServer做的是前台的工作的話,那么controller manager就是負責后台的。每一個資源都對應一個控制器。而control manager就是負責管理這些控制器的,比如我們通過APIServer創建了一個Pod,當這個Pod創建成功后,APIServer的任務就算完成了。而后面保證Pod的狀態始終和我們預期的一樣的重任就由controller manager去保證了。

etcd:etcd是一個高可用的鍵值存儲系統,kubernetes使用它來存儲各個資源的狀態,從而實現了Restful的API。
延伸2:對master節點服務組件的理解:
每個Node節點主要由三個模板組成:kubelet、kube-proxy、runtime。
runtime:runtime指的是容器運行環境,目前Kubernetes支持docker和rkt兩種容器。

kube-proxy: 該模塊實現了kubernetes中的服務發現和反向代理功能。kube-proxy支持TCP和UDP連接轉發,默認基於Round Robin算法將客戶端流量轉發到與service對應的一組后端pod。服務發現方面,kube-proxy使用etcd的watch機制,監控集群中service和endpoint對象數據的動態變化,並且維護一個service到endpoint的映射關系,從而保證了后端pod的IP變化不會對訪問者造成影響。另外,kube-proxy還支持session affinity。

kublet:kublet是Master在每個Node節點上面的agent,是Node節點上面最重要的模塊,它負責維護和管理該Node上的所有容器,但是如果容器不是通過kubernetes創建的,它並不會管理。本質上,它負責使Pod的運行狀態與期望的狀態一致。

三 部署規划

3.1 節點規划

節點
IP
類型
運行服務
master01
172.24.8.71
Kubernetes master節點
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、kube-nginx、flannel
master02
172.24.8.72
Kubernetes master節點
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、kube-nginx、flannel
master03
172.24.8.73
Kubernetes master節點
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、kube-nginx、flannel
worker01
172.24.8.74
Kubernetes node節點1
docker、etcd、kubelet、proxy、flannel
worker02
172.24.8.75
Kubernetes node節點2
docker、etcd、kubelet、proxy、flannel
VIP
172.24.8.100

提示:本實驗使用三節點master部署,從而實現master的高可用。

3.2 組件及版本

  • Kubernetes 1.18.3
  • Docker 19.03.12
  • Etcd 3.3.22
  • Flanneld 0.12.0
  • 插件:
    • Coredns
    • Dashboard
    • Metrics-server
    • Longhorn

3.3 組件策略

kube-apiserver:

  • 使用節點本地 nginx 4 層透明代理實現高可用;
  • 關閉非安全端口 8080 和匿名訪問;
  • 在安全端口 6443 接收 https 請求;
  • 嚴格的認證和授權策略 (x509、token、RBAC);
  • 開啟 bootstrap token 認證,支持 kubelet TLS bootstrapping;
  • 使用 https 訪問 kubelet、etcd,加密通信;

kube-controller-manager:

  • 3 節點高可用;
  • 關閉非安全端口,在安全端口 10259 接收 https 請求;
  • 使用 kubeconfig 訪問 apiserver 的安全端口;
  • 自動 approve kubelet 證書簽名請求 (CSR),證書過期后自動輪轉;
  • 各 controller 使用自己的 ServiceAccount 訪問 apiserver;

kube-scheduler:

  • 3 節點高可用;
  • 使用 kubeconfig 訪問 apiserver 的安全端口;

kubelet:

  • 使用 kubeadm 動態創建 bootstrap token,而不是在 apiserver 中靜態配置;
  • 使用 TLS bootstrap 機制自動生成 client 和 server 證書,過期后自動輪轉;
  • 在 KubeletConfiguration 類型的 JSON 文件配置主要參數;
  • 關閉只讀端口,在安全端口 10250 接收 https 請求,對請求進行認證和授權,拒絕匿名訪問和非授權訪問;
  • 使用 kubeconfig 訪問 apiserver 的安全端口;

kube-proxy:

  • 使用 kubeconfig 訪問 apiserver 的安全端口;
  • 在 KubeProxyConfiguration 類型的 JSON 文件配置主要參數;
  • 使用 ipvs 代理模式;

集群插件:

  • DNS:使用功能、性能更好的 coredns;
  • Dashboard:支持登錄認證;
  • Metric:metrics-server,使用 https 訪問 kubelet 安全端口;
  • Longhorn:Kubernetes的開源分布式塊存儲系統。

提示:本方案后續操作若未特別說明,則表示所有操作僅需要在master01節點進行。

本方案總體參考:https://github.com/opsnull/follow-me-install-kubernetes-cluster。

四 前置准備

4.1 手動添加解析

  1 [root@master01 ~]# hostnamectl set-hostname master01	#其他節點依次修改對應主機名
  2 [root@master01 ~]# cat >> /etc/hosts << EOF
  3 172.24.8.71 master01
  4 172.24.8.72 master02
  5 172.24.8.73 master03
  6 172.24.8.74 worker01
  7 172.24.8.75 worker02
  8 172.24.8.76 worker03
  9 EOF

4.2 初始化准備

[root@master01 ~]# vi k8sinit.sh

  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: k8sinit.sh
  4 # Author: xhy
  5 # Create Date: 2020-06-27 21:59
  6 # Modify Author: xhy
  7 # Modify Date: 2020-06-27 21:59
  8 # Version: 
  9 #***************************************************************#
 10 # Initialize the machine. This needs to be executed on every machine.
 11 
 12 # Mkdir k8s directory
 13 mkdir -p /opt/k8s/bin/
 14 mkdir -p /data/k8s/k8s
 15 mkdir -p /data/k8s/docker
 16 
 17 # Install docker
 18 useradd -m docker
 19 
 20 # Disable the SELinux.
 21 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
 22 
 23 # Turn off and disable the firewalld.
 24 systemctl stop firewalld
 25 systemctl disable firewalld
 26 
 27 # Modify related kernel parameters & Disable the swap.
 28 cat > /etc/sysctl.d/k8s.conf << EOF
 29 net.ipv4.ip_forward = 1
 30 net.bridge.bridge-nf-call-ip6tables = 1
 31 net.bridge.bridge-nf-call-iptables = 1
 32 net.ipv4.tcp_tw_recycle = 0
 33 vm.swappiness = 0
 34 vm.overcommit_memory = 1
 35 vm.panic_on_oom = 0
 36 net.ipv6.conf.all.disable_ipv6 = 1
 37 EOF
 38 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
 39 swapoff -a
 40 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
 41 modprobe br_netfilter
 42 
 43 # Add ipvs modules
 44 cat > /etc/sysconfig/modules/ipvs.modules <<EOF
 45 #!/bin/bash
 46 modprobe -- ip_vs
 47 modprobe -- ip_vs_rr
 48 modprobe -- ip_vs_wrr
 49 modprobe -- ip_vs_sh
 50 modprobe -- nf_conntrack_ipv4
 51 modprobe -- nf_conntrack
 52 EOF
 53 
 54 chmod 755 /etc/sysconfig/modules/ipvs.modules
 55 bash /etc/sysconfig/modules/ipvs.modules
 56 
 57 # Install rpm
 58 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget gcc gcc-c++ make libnl libnl-devel libnfnetlink-devel openssl-devel
 59 
 60 # Update kernel
 61 rpm --import http://down.linuxsb.com:8888/RPM-GPG-KEY-elrepo.org
 62 rpm -Uvh http://down.linuxsb.com:8888/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
 63 yum --disablerepo="*" --enablerepo="elrepo-kernel" install -y kernel-ml
 64 sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/' /etc/default/grub
 65 grub2-mkconfig -o /boot/grub2/grub.cfg
 66 yum update -y
 67 
 68 # ADD k8s bin to PATH
 69 echo 'export PATH=/opt/k8s/bin:$PATH' >> /root/.bashrc
 70 
 71 # Reboot the machine.
 72 # reboot

腳本釋義:此腳本所包含的操作及優化分解如下:

  • 添加docker賬戶;
  • 關閉SELinux;
  • 關閉iptables;
  • 關閉swap:
    • vm.swappiness = 0
  • 其他內核優化:
    • vm.overcommit_memory = 1 # 不檢查物理內存是否夠用
    • vm.panic_on_oom = 0 # 開啟 OOM
    • net.ipv6.conf.all.disable_ipv6 = 1 # 關閉 IPV6
    • net.ipv4.ip_forward = 1 # 打開轉發功能
    • net.bridge.bridge-nf-call-ip6tables = 1
    • net.bridge.bridge-nf-call-iptables = 1 # 橋接流量獲得通過主機iptables規則
    • net.ipv4.tcp_tw_recycle = 0 # 開啟TCP連接中TIME-WAIT sockets的快速回收
    • net.ipv6.conf.all.disable_ipv6 = 1 # 禁用整個系統所有接口的IPv6

提示:必須關閉 tcp_tw_recycle,否則和 NAT 沖突,會導致服務不通;關閉 IPV6,防止觸發 docker BUG。

  • 安裝建議軟件包;

提示:為了更好的管理和查看ipvs,可安裝相應的管理工具ipvsadm,具體使用參考《002.LVS管理工具的安裝與使用》。

  • 加載IPVS:

pod的負載均衡是用kube-proxy來實現的,實現方式有兩種,一種是默認的iptables,一種是ipvs,相對iptables,ipvs有更好的性能。且當前ipvs已經加入到了內核的主干。

    • ip_vs
    • ip_vs_rr
    • ip_vs_wrr
    • ip_vs_sh
    • nf_conntrack_ipv4
  • 升級內核版本。

提示:對於某些特性,可能需要升級內核,內核升級操作見《018.Linux升級內核》。4.19版及以上內核nf_conntrack_ipv4已經改為nf_conntrack。

4.3 互信配置

為了更方便遠程分發文件和執行命令,本實驗配置master節點到其它節點的 ssh 信任關系。

  1 [root@master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N ''
  2 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01
  3 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master02
  4 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker01
  5 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker02

提示:本步驟操作僅需要在master01節點操作。

4.4 環境變量

[root@master01 ~]# vi environment.sh

  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: environment.sh
  4 # Author: xhy
  5 # Create Date: 2020-06-27 22:19
  6 # Modify Author: xhy
  7 # Modify Date: 2020-06-27 22:19
  8 # Version: 
  9 #***************************************************************#
 10 
 11 # 生成 EncryptionConfig 所需的加密 key
 12 export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
 13 
 14 # 集群 MASTER 機器 IP 數組
 15 export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73)
 16 
 17 # 集群 MASTER IP 對應的主機名數組
 18 export MASTER_NAMES=(master01 master02 master03)
 19 
 20 # 集群 NODE 機器 IP 數組
 21 export NODE_IPS=(172.24.8.74 172.24.8.75)
 22 
 23 # 集群 NODE IP 對應的主機名數組
 24 export NODE_NAMES=(worker01 worker02)
 25 
 26 # 集群所有機器 IP 數組
 27 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75)
 28 
 29 # 集群所有IP 對應的主機名數組
 30 export ALL_NAMES=(master01 master02 master03 worker01 worker02)
 31 
 32 # etcd 集群服務地址列表
 33 export ETCD_ENDPOINTS="https://172.24.8.71:2379,https://172.24.8.72:2379,https://172.24.8.73:2379"
 34 
 35 # etcd 集群間通信的 IP 和端口
 36 export ETCD_NODES="master01=https://172.24.8.71:2380,master02=https://172.24.8.72:2380,master03=https://172.24.8.73:2380"
 37 
 38 # kube-apiserver 的反向代理(kube-nginx)地址端口
 39 export KUBE_APISERVER="https://172.24.8.100:16443"
 40 
 41 # 節點間互聯網絡接口名稱
 42 export IFACE="eth0"
 43 
 44 # etcd 數據目錄
 45 export ETCD_DATA_DIR="/data/k8s/etcd/data"
 46 
 47 # etcd WAL 目錄,建議是 SSD 磁盤分區,或者和 ETCD_DATA_DIR 不同的磁盤分區
 48 export ETCD_WAL_DIR="/data/k8s/etcd/wal"
 49 
 50 # k8s 各組件數據目錄
 51 export K8S_DIR="/data/k8s/k8s"
 52 
 53 # docker 數據目錄
 54 export DOCKER_DIR="/data/k8s/docker"
 55 
 56 ## 以下參數一般不需要修改
 57 
 58 # TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
 59 BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
 60 
 61 # 最好使用 當前未用的網段 來定義服務網段和 Pod 網段
 62 
 63 # 服務網段,部署前路由不可達,部署后集群內路由可達(kube-proxy 保證)
 64 SERVICE_CIDR="10.20.0.0/16"
 65 
 66 # Pod 網段,建議 /16 段地址,部署前路由不可達,部署后集群內路由可達(flanneld 保證)
 67 CLUSTER_CIDR="10.10.0.0/16"
 68 
 69 # 服務端口范圍 (NodePort Range)
 70 export NODE_PORT_RANGE="1-65535"
 71 
 72 # flanneld 網絡配置前綴
 73 export FLANNEL_ETCD_PREFIX="/kubernetes/network"
 74 
 75 # kubernetes 服務 IP (一般是 SERVICE_CIDR 中第一個IP)
 76 export CLUSTER_KUBERNETES_SVC_IP="10.20.0.1"
 77 
 78 # 集群 DNS 服務 IP (從 SERVICE_CIDR 中預分配)
 79 export CLUSTER_DNS_SVC_IP="10.20.0.254"
 80 
 81 # 集群 DNS 域名(末尾不帶點號)
 82 export CLUSTER_DNS_DOMAIN="cluster.local"
 83 
 84 # 將二進制目錄 /opt/k8s/bin 加到 PATH 中
 85 export PATH=/opt/k8s/bin:$PATH

  1 [root@master01 ~]# chmod u+x *.sh
  2 [root@master01 ~]# source /root/environment.sh

4.5 分發並執行環境初始化

  1 [root@master01 ~]# for all_ip in ${ALL_IPS[@]}
  2   do
  3     echo ">>> ${all_ip}"
  4     scp -rp /etc/hosts root@${all_ip}:/etc/hosts
  5     scp -rp k8sinit.sh root@${all_ip}:/root/
  6     ssh root@${all_ip} "bash /root/k8sinit.sh"
  7   done

提示:本步驟操作僅需要在master01節點操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM