写点什么

运维训练营第十二课作业

作者:好吃不贵
  • 2023-01-29
    浙江
  • 本文字数:2322 字

    阅读完需:约 8 分钟

  1. 使用 kubeadm 部署一个分布式的 kubernetes 集群;

  2. 扩展:使用 kubeasz 部署一个分布式的 kubenetes 集群;

  3. 在集群上编排运行 demoapp,并使用 service 完成 Pod 发现和服务发布;

  4. 要求以配置文件的方式,在集群上编排运行 nginx,并使用 service 完成 Pod 发现和服务发布;

  5. 扩展作业:要求以配置文件的方式,在集群上编排运行 wordpress 和 mysql,并使用 service 完成 Pod 发现和服务发布

  6. 提示:使用变量的方式,为 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 增加以上配置即可。

inet 172.29.1.253/24 brd 172.29.1.255 scope global noprefixroute enp0s8inet 172.29.1.1/24 brd 172.29.1.255 scope global noprefixroute enp0s10inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
复制代码

可以看到 master 上配置的 IP 是 172.29.1.1,另外一张网卡的 IP 是 172.29.1.253 的,给 kubeapi 使用。

安装需要的包

配置阿里云的代理:

cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial mainEOF
复制代码

注意这里用 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


用户头像

好吃不贵

关注

还未添加个人签名 2018-11-20 加入

还未添加个人简介

评论

发布
暂无评论
运维训练营第十二课作业_好吃不贵_InfoQ写作社区