在上一篇,我们基于minikube搭建了一个单节点的k8s集群,作为学习和练习使用的话问题不大,但如果想深入学习和了解k8s的相关技术体系,还是需要搭建真正的集群才能更接近生产环境的应用,本篇将基于KubeAdmin,也是官方推荐的一种方式,实战演示下搭建一个k8s集群的完整过程;
1、两台(或更多)虚拟机(云服务器),配置:至少2核4G,系统:centos7+;
2、本篇基于阿里云centos7.5的版本进行操作演示;
服务器IP | 角色 | 配置 |
120.55.XX.42 | master | 2核4G |
120.55.XX.5 | node | 2核4G |
在正式安装k8之前,需要确保当前服务器已经安装了docker
在多个机器上均需执行,后文均做如此操作;
yum install -y yum-utils device-mapper-persistent-data lvm2
不设置的话,后面拉取镜像的时候可能会比较慢,建议设置一下;
yum list docker-ce --showduplicates | sort -r
根据上一步的结果选择合适的版本即可
yum -y install docker-ce-20.10.10-3.el7
systemctl enable docker.service
systemctl start docker
设置完毕后,可以通过下面的命令检查下docker的状态
systemctl status docker
需要同时在主节点和工作节点执行,在本篇的演示中,我们以左边的os1为主节点,os2为从节点为例进行说明;
执行下面的命令进行配置
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
该操作在主节点和工作节点均需执行
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
看到下面的内容,需要耐心的等待一会,毕竟需要从镜像仓库拉取不少安装包
在主节点执行下面的命令
kubeadm init \
--apiserver-advertise-address=云服务器的内网IP \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
参数说明:
apiserver-advertise-address 这里,如果使用的是阿里云服务器,一定要使用内网IP地址,可以在控制台实例看
执行的过程可能毕竟长,需要耐心的等待一会;
出现下面的界面时候,说明初始化完成;
需要重点注意圈起来的部分,拷贝出来,再在当前的节点执行一下;
执行过程
在上一步初始化工作完成后,我们注意到下面的这一行,意思就是可以将其他节点作为工作节点加入进来即可;
在另一个节点执行下面的命令
kubeadm join 主节点IP:6443 --token 7f0b62.87iazq6vxo993klg \
--discovery-token-ca-cert-hash sha256:e27bc6a7024ca69aa7f1f6a9e3718e8590cc00dad5894e607f83419048a9b57f
执行过程
看到下面的结果,说明新的节点加入成功
kubectl get nodes
从上面展示的节点信息来看,状态还是NotReady的,因为还缺少互相通信的网络插件,接下来需要继续执行相关操作;
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
再次查看节点状态,这时候发现状态就变成了ready;
注意,上面的命令只能在master节点,即主节点上执行
kubectl get pods -n kube-system
kubectl get pod -A
到这里,我们基于KubeAdm就初步完成了一个k8s集群的搭建,接下来,将基于这个k8s集群快速部署一个nginx应用;
需求描述
使用k8s集群部署一个nginx,并可以通过公网IP进行访问
deployment是Pod控制器的一种,名称自己定义,nginx镜像版本自行选择;
kubectl create deployment test-nginx --image=nginx:1.23.0
kubectl get deployment,pod,svc
可以看到上面创建的test-nginx;
我们知道,nginx默认监听80端口,上面只是创建了nginx对应的deployment(pod),但是外网要访问的话,对于k8s来说,还必须要将其暴露出去才可以;
在上文,通过Minikube搭建的k8s,最后部署nginx时候,只有NodePort 才能被外网访问,接下来需要创建一个Service,类型为NodePort的服务;
kubectl expose deployment test-nginx --port=80 --type=NodePort
再次查看pod,svc信息,可以看到就到产生了一个NodePort的service
在访问之前,如果使用的是阿里云或者腾讯云等云服务器,还需在安全组中将端口开放一下,需要开放的是上述的80:31077中的31077这个端口,然后通过主节点 + 31077即可访问;
由于工作节点同为整个集群中的一个节点,所以也可以通过工作节点 + 端口的方式访问,如下:
使用Kubeadm部署nginx,暴露端口对外服务,会随机选端口,默认范围是30000~32767,也可以手动修改指定,有兴趣的同学可以继续研究下。