相應的充足資源的Linux服務器;node
設置相應的主機名,參考命令:linux
1 hostnamectl set-hostname k8smaster
Mac及UUID惟一;nginx
若未關閉防火牆則建議放通相應端口,以下:算法
Master節點——
docker
規則bootstrap |
方向後端 |
端口範圍api |
做用數組 |
使用者安全 |
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 |
Worker 節點——
規則 |
方向 |
端口範圍 |
做用 |
使用者 |
TCP |
Inbound |
10250 |
Kubelet API |
Self, Control plane |
TCP |
Inbound |
30000-32767 |
NodePort Services** |
All |
延伸1:對master節點服務組件的理解:
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的運行狀態與指望的狀態一致。
提示:本實驗使用三節點master部署,從而實現master的高可用。
kube-apiserver:
kube-controller-manager:
kube-scheduler:
kubelet:
kube-proxy:
集羣插件:
注意:如下4.1至4.7步驟可經過以下腳本快速實現:
1 [root@k8smaster01 ~]# vi k8sinit.sh 2 # Modify Author: xhy 3 # Modify Date: 2019-06-23 22:19 4 # Version: 5 #***************************************************************# 6 # Initialize the machine. This needs to be executed on every machine. 7 8 # Add host domain name. 9 cat >> /etc/hosts << EOF 10 172.24.8.71 k8smaster01 11 172.24.8.72 k8smaster02 12 172.24.8.73 k8smaster03 13 172.24.8.74 k8snode01 14 172.24.8.75 k8snode02 15 EOF 16 17 # Add docker user 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 EOF 52 chmod 755 /etc/sysconfig/modules/ipvs.modules 53 bash /etc/sysconfig/modules/ipvs.modules 54 55 # Install rpm 56 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget 57 58 # Create k8s directory $$ Add system PATH 59 mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert 60 echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc 61 source /root/.bashrc 62 63 # Reboot the machine. 64 reboot
1 [root@k8smaster01 ~]# cat <<EOF >> /etc/hosts 2 172.24.8.71 k8smaster01 3 172.24.8.72 k8smaster02 4 172.24.8.73 k8smaster03 5 172.24.8.74 k8snode01 6 172.24.8.75 k8snode02 7 EOF
提示:全部節點均建議如上操做。
1 [root@k8smaster01 ~]# useradd -m docker
提示:全部節點均建議如上操做。
1 [root@k8smaster01 ~]# setenforce 0 2 [root@k8smaster01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
1 [root@k8smaster01 ~]# systemctl stop firewalld 2 [root@k8smaster01 ~]# systemctl disable firewalld #關閉防火牆 3 [root@k8smaster01 ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf 4 net.bridge.bridge-nf-call-ip6tables = 1 5 net.bridge.bridge-nf-call-iptables = 1 6 net.ipv4.ip_forward = 1 7 EOF 8 [root@k8smaster01 ~]# modprobe br_netfilter 9 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
提示:全部節點均建議如上操做。
1 [root@k8smaster01 ~]# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 2 [root@k8smaster01 ~]# echo "vm.swappiness = 0" >> /etc/sysctl.d/k8s.conf #禁止使用 swap 空間,只有當系統 OOM 時才容許使用它 3 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
1 [root@k8smaster01 ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf 2 vm.overcommit_memory = 1 # 不檢查物理內存是否夠用 3 vm.panic_on_oom = 0 # 開啓 OOM 4 net.ipv6.conf.all.disable_ipv6 = 1 # 關閉 IPV6 5 EOF 6 [root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf 7 [root@k8smaster01 ~]# mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert #建立相應目錄 8 [root@k8smaster01 ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
提示:必須關閉 tcp_tw_recycle,不然和 NAT 衝突,會致使服務不通;
關閉 IPV6,防止觸發 docker BUG。
pod的負載均衡是用kube-proxy來實現的,實現方式有兩種,一種是默認的iptables,一種是ipvs,相對iptables,ipvs有更好的性能。且當前ipvs已經加入到了內核的主幹。
爲kube-proxy開啓ipvs的前提須要加載如下的內核模塊:
1 [root@k8smaster01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF 2 #!/bin/bash 3 modprobe -- ip_vs 4 modprobe -- ip_vs_rr 5 modprobe -- ip_vs_wrr 6 modprobe -- ip_vs_sh 7 modprobe -- nf_conntrack_ipv4 8 EOF 9 [root@k8smaster01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules 10 [root@k8smaster01 ~]# bash /etc/sysconfig/modules/ipvs.modules 11 [root@k8smaster01 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4 12 [root@k8smaster01 ~]# yum -y install ipvsadm
提示:全部節點均建議如上操做。
爲了更好的管理和查看ipvs,可安裝相應的管理工具《002.LVS管理工具的安裝與使用》。
爲了更方便遠程分發文件和執行命令,本實驗配置master節點到其它節點的 ssh 信任關係。
1 [root@k8smaster01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' 2 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster01 3 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster02 4 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8smaster03 5 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8snode01 6 [root@k8smaster01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8snode02
提示:此操做僅須要在master節點操做。
後續使用的環境變量都定義在文件 environment.sh 中,同時拷貝到全部節點的 /opt/k8s/bin 目錄:
1 #!/usr/bin/bash 2 3 # 生成 EncryptionConfig 所需的加密 key 4 export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) 5 6 # 集羣 MASTER 機器 IP 數組 7 export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73) 8 9 # 集羣 MASTER IP 對應的主機名數組 10 export MASTER_NAMES=(k8smaster01 k8smaster02 k8smaster03) 11 12 # 集羣 NODE 機器 IP 數組 13 export NODE_IPS=(172.24.8.74 172.24.8.75) 14 15 # 集羣 NODE IP 對應的主機名數組 16 export NODE_NAMES=(k8snode01 k8snode02) 17 18 # 集羣全部機器 IP 數組 19 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75) 20 21 # 集羣全部IP 對應的主機名數組 22 export ALL_NAMES=(k8smaster01 k8smaster02 k8smaster03 k8snode01 k8snode02) 23 24 # etcd 集羣服務地址列表 25 export ETCD_ENDPOINTS="https://172.24.8.71:2379,https://172.24.8.72:2379,https://172.24.8.73:2379" 26 27 # etcd 集羣間通訊的 IP 和端口 28 export ETCD_NODES="k8smaster01=https://172.24.8.71:2380,k8smaster02=https://172.24.8.72:2380,k8smaster03=https://172.24.8.73:2380" 29 30 # kube-apiserver 的反向代理(kube-nginx)地址端口 31 export KUBE_APISERVER="https://127.0.0.1:8443" 32 33 # 節點間互聯網絡接口名稱 34 export IFACE="eth0" 35 36 # etcd 數據目錄 37 export ETCD_DATA_DIR="/data/k8s/etcd/data" 38 39 # etcd WAL 目錄,建議是 SSD 磁盤分區,或者和 ETCD_DATA_DIR 不一樣的磁盤分區 40 export ETCD_WAL_DIR="/data/k8s/etcd/wal" 41 42 # k8s 各組件數據目錄 43 export K8S_DIR="/data/k8s/k8s" 44 45 # docker 數據目錄 46 export DOCKER_DIR="/data/k8s/docker" 47 48 ## 如下參數通常不須要修改 49 50 # TLS Bootstrapping 使用的 Token,可使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成 51 BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c" 52 53 # 最好使用 當前未用的網段 來定義服務網段和 Pod 網段 54 55 # 服務網段,部署前路由不可達,部署後集羣內路由可達(kube-proxy 保證) 56 SERVICE_CIDR="10.254.0.0/16" 57 58 # Pod 網段,建議 /16 段地址,部署前路由不可達,部署後集羣內路由可達(flanneld 保證) 59 CLUSTER_CIDR="172.30.0.0/16" 60 61 # 服務端口範圍 (NodePort Range) 62 export NODE_PORT_RANGE="30000-32767" 63 64 # flanneld 網絡配置前綴 65 export FLANNEL_ETCD_PREFIX="/kubernetes/network" 66 67 # kubernetes 服務 IP (通常是 SERVICE_CIDR 中第一個IP) 68 export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1" 69 70 # 集羣 DNS 服務 IP (從 SERVICE_CIDR 中預分配) 71 export CLUSTER_DNS_SVC_IP="10.254.0.2" 72 73 # 集羣 DNS 域名(末尾不帶點號) 74 export CLUSTER_DNS_DOMAIN="cluster.local" 75 76 # 將二進制目錄 /opt/k8s/bin 加到 PATH 中 77 export PATH=/opt/k8s/bin:$PATH
1 [root@k8smaster01 ~]# source environment.sh 2 [root@k8smaster01 ~]# for all_ip in ${ALL_IPS[@]} 3 do 4 echo ">>> ${all_ip}" 5 scp environment.sh root@${all_ip}:/opt/k8s/bin/ 6 ssh root@${all_ip} "chmod +x /opt/k8s/bin/*" 7 done