本文将详细介绍在阿里云平台上,使用terway网络的ENI多IP模式,自建一个kubernetes集群的完整过程。包括在阿里云上创建vpc、创建对应实例ECS,安装docker、kubernetes环境,安装terway网络插件,运行pod的完整过程。
创建过程中使用到的资源及其版本:
资源 | 版本 |
---|---|
centos | 7.8 |
docker | docker: 19.03.5 |
kubernetes | 19.03.5 |
terway | v1.0.10.122 |
阿里云产品:
阿里云产品 | 个数 |
---|---|
vpc | 1 |
交换机 | 2 |
企业安全组 | 2 |
RAM权限管理 | 1 |
1、创建vpc及交换机及企业级安全组
1)如图1,在阿里云平台上创建一个10.0.0.0/8网段的vpc。
2)如图2,在上面创建的vpc中创建两个交换机,pod交换机(10.0.0.0/24)给集群中pod使用,node交换机(10.0.1.0/24)给node节点及其他使用。
注:生产环境中,建议创建4个交换机,2个pod交换机和2个node交换机,实现高可用;
pod交换机设置的网段建议设置大一些
3) 创建企业级安全组
如图3,创建node使用的企业级安全组。
如图4,创建pod使用的企业级安全组。
2、创建阿里云实例
创建三台阿里云实例,一台为master,两台为node节点,构成一个kubernetes集群。
节点 | IP |
---|---|
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=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
继续执行以下命令
yum makecache
yum 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-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates|sort -r
yum install docker-ce-cli-19.03.5 -y
yum install docker-ce-19.03.5 -y
systemctl enable docker
3)启动kubernetes集群
1)修改hosts
cat >> /etc/hosts << EOF
10.0.0.187 master00
10.0.0.188 node00
10.0.0.189 node01
EOF
2)禁用swap
sed -i '/swap/s/^/#/' /etc/fstab #永久关闭swap
3)启动docker
systemctl start docker
4)安装命令补全
yum -y install bash-completion #安装bash-completion
source /etc/profile.d/bash_completion.sh #加载bash-completion
5)启动kubernetes
配置kubernetes启动配置文件config.yaml
cat >> /root/config.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: 1.18.6
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "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/20
podSubnet:pod网段,为在vpc创建的pod交换机的网段
启动kubeadm
kubeadm init --config=/root/config.yaml --upload-certs
上条命令执行后,执行图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状态
说明:coredns仍为pending状态,在等待安装网络插件
4、安装terway网络插件(ENI多IP模式)
a: 添加RAM授权
如图7,在阿里云RAM控制台中,点击“权限策略管理”,再点击“创建权限策略”;
如图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角色”
如图11和图12,点击“用户”,点击“创建用户”,并为该用户授权
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/v1beta1
apiVersion: apps/v1
kind: DaemonSet
再对DaemonSet添加selector配置,如图15所示
selector:
matchLabels:
app: terway
若无上述针对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状态
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状态
6、创建示例pod
新增一个nginx.yml文件,创建两个nginx pod,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
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
生成的两个nginx pod正常运行,也分配了IP,在阿里云控制台的“弹性网卡”中,也能看到生成了对应的辅助网卡。
创建kubernetes集群完成。