本文將詳細介紹在阿里雲平臺上,使用terway網路的ENI多IP模式,自建一個kubernetes叢集的完整過程。包括在阿里雲上建立vpc、建立對應例項ECS,安裝docker、kubernetes環境,安裝terway網路外掛,執行pod的完整過程。
建立過程中使用到的資源及其版本:
centos: 7.8
docker: 19.03.5
kubernetes: 19.03.5
terway: v1.0.10.122
阿里雲產品:
一個vpc,兩個交換機,兩個企業安全組,RAM許可權管理
1、建立vpc及交換機及企業級安全組
1)如圖1,在阿里雲平臺上建立一個10.0.0.0/8網段的vpc。
圖1 vpc示例
2)如圖2,在上面建立的vpc中建立兩個交換機,pod交換機(10.0.0.0/24)給叢集中pod使用,node交換機(10.0.1.0/24)給node節點及其他使用。
注:生產環境中,建議建立4個交換機,2個pod交換機和2個node交換機,實現高可用;
pod交換機設定的網段建議設定大一些
圖2 交換機示例
3) 建立企業級安全組
如圖3,建立node使用的企業級安全組。
圖3 node企業級安全組
如圖4,建立pod使用的企業級安全組。
圖4 pod企業級安全組
2、建立阿里雲實例
建立三臺阿里雲實例,一臺為master,兩臺為node節點,構成一個kubernetes叢集。
master00: 10.0.0.187
node00:10.0.0.188
node01:10.0.0.189
注:阿里雲實例建議選網路最佳化型,主要看例項的彈性網絡卡數量以及單塊彈性網絡卡的私有IP數量。
能建立的pod個數=(彈性網絡卡數量-主網絡卡數量)* 單塊彈性網絡卡的私有IP數量
參考:https://help.aliyun.com/document_detail/108490.html?spm=a2c4g.11186623.6.604.27b51e51vet94k#section-ijd-dkf-hht
3、搭建叢集
1)安裝kubernetes
將下面內容寫入/etc/yum.repo.d/kubernetes.repo檔案中
[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
繼續執行以下命令
yum makecacheyum list kubeadm --showduplicates | sort -r #檢視所有kubeadm版本yum install kubectl-1.18.6-0.x86_64 kubelet-1.18.6-0.x86_64 kubeadm-1.18.6-0.x86_64 安裝對應版本rpm -qa |grep kube 檢視安裝的版本systemctl enable kubelet 注:最好不要安裝最新版本的
說明:
kubelet 執行在叢集所有節點上,用於啟動Pod和容器等物件的工具kubeadm 用於初始化叢集,啟動叢集的命令工具kubectl 用於和叢集通訊的命令列,透過kubectl可以部署和管理應用,檢視各種資源,建立、刪除和更新各種元件2)安裝docker
yum install -y yum-utilsyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum list docker-ce --showduplicates|sort -ryum install docker-ce-cli-19.03.5 -yyum install docker-ce-19.03.5 -ysystemctl enable docker
3)啟動kubernetes叢集
1)修改hosts
cat >> /etc/hosts << EOF10.0.0.187 master0010.0.0.188 node0010.0.0.189 node01EOF
2)禁用swap
sed -i '/swap/s/^/#/' /etc/fstab #永久關閉swap
3) 啟動docker
systemctl start docker
4) 安裝命令補全
yum -y install bash-completion #安裝bash-completionsource /etc/profile.d/bash_completion.sh #載入bash-completion
5) 啟動kubernetes
配置kubernetes啟動配置檔案config.yaml
cat >> /root/config.yaml << EOFapiVersion: kubeadm.k8s.io/v1beta2kind: ClusterConfigurationkubernetesVersion: 1.18.6imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerscontrolPlaneEndpoint: "ali-k8s.cici.com:6443"networking: serviceSubnet: "172.21.0.0/20" podSubnet: "10.0.1.0/24" dnsDomain: "cluster.local"EOF
說明:
kubernetesVersion: 與kubeadm版本相同imageRepository: 修改映象地址controlPlaneEndpoint:若使用域名,需加解析serviceSubnet:必須為172.21.0.0/20podSubnet:pod網段,為在vpc建立的pod交換機的網段啟動kubeadm
kubeadm init --config=/root/config.yaml --upload-certs
圖5 kubeadm啟動過程
上條命令執行後,執行圖5中的三條命令
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
檢視pod狀態
圖6 pod狀態
說明:coredns仍為pending狀態,在等待安裝網路外掛
4、安裝terway網路外掛(ENI多IP模式)
a: 新增RAM授權
圖7 許可權策略
如圖8,新建自定義許可權策略,策略名稱自定義即可,選擇“指令碼配置”,匯入授權內容
圖8 自定義許可權策略
匯入以下授權內容,terway網路外掛gitub地址:https://github.com/AliyunContainerService/terway
{ "Version": "1", "Statement": [{ "Action": [ "ecs:CreateNetworkInterface", "ecs:DescribeNetworkInterfaces", "ecs:AttachNetworkInterface", "ecs:DetachNetworkInterface", "ecs:DeleteNetworkInterface", "ecs:DescribeInstanceAttribute", "ecs:DescribeInstanceTypes", "ecs:AssignPrivateIpAddresses", "ecs:UnassignPrivateIpAddresses", "ecs:DescribeInstances" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Action": [ "vpc:DescribeVSwitches" ], "Resource": [ "*" ], "Effect": "Allow" } ]}
如圖9和圖10,點選“RAM角色管理”,再點選“建立RAM角色”
圖9 建立RAM角色管理1
圖10 建立RAM角色管理2
圖11 建立使用者2
圖12 使用者授權
建立完使用者,儲存accessid及accesskey。
b: 在master00機器上修改terway-multiip.yml配置檔案
從terway的github地址中下載terway-multiip.yml檔案,vim開啟,修改以下內容。
eni_conf: | { "version": "1", "access_key": "LTAI4G1nd2WCKGqxxxxxxxxx", "access_secret": "0Q5ucAIlcSkQNryrBTsJGxxxxxxxxx", "security_group": "sg-2ze52xbcwx5gytpb4g48", "service_cidr": "172.21.0.0/20", "vswitches": { "cn-beijing-g": ["vsw-2zex462fejdtk902i7i74"] }, "max_pool_size": 5, "min_pool_size": 0 }
開啟terway-multiip.yml檔案,將DaemonSet的apiVersion由extensions/v1beta1修改為apps/v1
#apiVersion: extensions/v1beta1apiVersion: apps/v1kind: DaemonSet
再對DaemonSet新增selector配置,如圖15所示
selector: matchLabels: app: terway
圖15 DaemonSet配置
若無上述針對DaemonSet配置的修改,將出現以下兩個錯誤
error: unable to recognize "terway-multiip.yml": no matches for kind "DaemonSet" in version "extensions/v1beta1"
error: error validating "terway-multiip.yml": error validating data: ValidationError(DaemonSet.spec): missing required field "selector" in io.k8s.api.apps.v1.DaemonSetSpec; if you choose to ignore these errors, turn validation off with --validate=false
安裝terway網路外掛
kubectl apply -f terway-multiip.yml
檢視kubernetes叢集pod狀態,如圖16
kubectl get pods -A
5、新增node節點
在master00節點上執行以下命令
kubeadm token create --print-join-command
將會生成一條命令,放到node節點上執行,即可將node節點加入到叢集中
kubeadm join ali-k8s.cici.com:6443 --token 8xrhvk.5clbyisk92yvaol3 --discovery-token-ca-cert-hash sha256:d4c1a51d5e1fef359230c00a97f4d9d26283bd3e5de9da26c1808549128dc9e6
注:node節點需能解析該域名ali-k8s.cici.com
如圖17和圖18,在master節點中檢視master和node節點狀態,以為各pod狀態
圖17 node狀態
圖18 pod狀態
6、建立示例pod
新增一個nginx.yml檔案,建立兩個nginx pod,內容如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80
執行apply命令:
kubectl apply -f nginx.yml
如圖19,檢視nginx pod狀態
圖19 nginx pod狀態
生成的兩個nginx pod正常執行,也分配了IP,在阿里雲控制檯的“彈性網絡卡”中,也能看到生成了對應的輔助網絡卡。
圖20 阿里雲彈性網絡卡
建立kubernetes叢集完成。