运维训练营第十二课作业
使用 kubeadm 部署一个分布式的 kubernetes 集群;
扩展:使用 kubeasz 部署一个分布式的 kubenetes 集群;
在集群上编排运行 demoapp,并使用 service 完成 Pod 发现和服务发布;
要求以配置文件的方式,在集群上编排运行 nginx,并使用 service 完成 Pod 发现和服务发布;
扩展作业:要求以配置文件的方式,在集群上编排运行 wordpress 和 mysql,并使用 service 完成 Pod 发现和服务发布
提示:使用变量的方式,为 wordpress 指定要使用 mysql 服务器地址、数据库名称、用户名称和用户密码;
1. kubeadm 部署一个分布式集群
本次搭建,会建立 1 个 master,2 个 node,如下图所示。
这里 k 是 kubectl 的别名。
具体脚本见 github: https://github.com/jianywu/cloud_learn/tree/main/k8s/kubeadm_install
虚拟机网络配置
本次实验,总共需要 3 台虚拟机。分别是 k8s-master01,以及 k8s-node01,k8s-node02。IP 配置如图所示,其中虚拟机网络使用 host-only,通过 netplan 来配置。
Windows 的 PC 上配置网关为 172.29.1.252。
修改/etc/netplan/01-network-manager-all.yaml 文件。
sudo netplan apply 增加以上配置即可。
可以看到 master 上配置的 IP 是 172.29.1.1,另外一张网卡的 IP 是 172.29.1.253 的,给 kubeapi 使用。
安装需要的包
配置阿里云的代理:
注意这里用 xenial 即可。
准备好 docker images。注意 pause:3.6 需要额外配置,即使加了云代理,也没法自动下载到这个镜像,除非用代理访问 k8s 的相关仓库。
docker pull registry.aliyuncs.com/google_containers/pause:3.6
docker tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
pull 的命令是:
kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock --image-repository=registry.aliyuncs.com/google_containers
其中--image-repository 是镜像仓库,默认是 registry.k8s.io。
安装 cri-dockerd:
dpkg -i cri-dockerd_0.3.0.3-0.ubuntu-focal_amd64.deb
另外还需要安装 flannel,否则 kubelet 会显示 cni 没有 ready。
kubectl apply -f kube-flannel.yml
装好之后,需要 export KUBECONFIG,否则 kubelet 会无法连接到 8080 端口。
打开所需的端口
都是 TCP 的端口。
控制节点
6443(API server),2379-2380(API server, etcd)。
工作节点
30000-32767(NodePort Services)。
master 节点创建
需要提前下载特定的镜像,比如 pause 等。
配置好之后,可以看到 kube-apiserver 的版本,是 1.26.0。
常见错误:
如果 kubeadm init 失败,40s 没连上,一般是因为 kubelet 没有起来。
kubeadm init --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=1.26.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs
安装好之后,执行配置:
export KUBECONFIG=/home/k8s/.kube/config
node 节点创建
具体命令如下:
kubeadm join kubeapi.magedu.com:6443 --token d12nr8.68stwcms88okv0wn --discovery-token-ca-cert-hash sha256:4f304fde6d79543cbd448b9701171ffb1eccac22e2439d463dbb78a76b4b3159
其中 token 和 key 是从 master 获得的。
安装好之后,执行配置:
export KUBECONFIG=/home/k8s/.kube/config
其中 config 文件是从 master 相同的目录获得的。
2. 在集群上编排运行 demoapp,并使用 service 完成 Pod 发现和服务发布
具体脚本见 github: https://github.com/jianywu/cloud_learn/tree/main/k8s/demoapp
创建 pod
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3
创建 service
kubectl create service nodeport demoapp --tcp=80:80
是 nodeport 类型的,端口映射是 80:80。
3. 要求以配置文件的方式,在集群上编排运行 nginx,并使用 service 完成 Pod 发现和服务发布
具体脚本见 github: https://github.com/jianywu/cloud_learn/tree/main/k8s/nginx
配置文件是
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 2
// 部署 2 个 nginx
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:alpine
// image,如果是 docker 的,会从 docker 去 pull
name: nginx
resources: {}
status: {}
通过 docker images 可以看到下载的 nginx 这个镜像。image 只下载到 node 节点,不会下载到 master 节点。
service 文件是
apiVersion: v1
kind: Service
// 类型是 Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- name: 80-80
port: 80
// 端口
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
// 类型
status:
loadBalancer: {}
查看容器的日志
k logs nginx-6c557cc74d-cwqsd
k describe nginx-6c557cc74d-cwqsd
4. 扩展作业:要求以配置文件的方式,在集群上编排运行 wordpress 和 mysql,并使用 service 完成 Pod 发现和服务发布
具体脚本见 github: https://github.com/jianywu/cloud_learn/tree/main/k8s/wordpress_non_official
部署了 3 个 wordpress 及 mysql。
service 采用 NodePort 的方式,selector 是 app 为 wordpress。
pod 如图所示:
目前服务搭建起来了,但是没有能从外部访问 wordpress。
参考资料
运维训练营
https://mp.weixin.qq.com/s/fX_SHoRYUFzGBZp9VidDSQ
评论