【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)

本篇文章开始给大家介绍Kubernetes的内容,听我朋友说现在10个人的团队都在研究项目上K8s了,可见其趋势和重要性,招聘岗位一搜,Linux云计算运维,百分之八九十都要求会K8s的,所以学好它至关重要,里面内容之多,逻辑之复杂,也不是别的工具能相比的,不多说了,开始今天的内容。

目录

K8s和Docker爱恨情仇

K8s的组件架构概述(手撕架构图)

K8s生产环境中部署的方式

一、Docker及系统环境部署

二、harbor部署

三、所有节点安装kubeadm,kubelet,kubectl

四、初始化master节点

五、配置所有worker节点加入镜像

六、配置自动补全功能

七、安装CNI插件并测试集群

资源管理

实战练习

一、推送游戏镜像至k8s集群

二、推送wordpress至k8s集群
​​​


K8s和Docker爱恨情仇

官网链接:https://kubernetes.io/zh-cn/

这个内容大家百度一搜都能搜到,我讲讲我知道的吧。

13年docker开源,国外好多大厂都在使用;

14年谷歌推出k8s,底层是对docker进行编排。同年docker推出了docker swarm、docker compose、dockr machine打算与k8s进行竞争,同年coreOS做了个类似docker的rkt,然后站队k8s,k8s不仅支持docker还支持rkt了,但是rkt用的人不多,可能是因为docker先入为主吧。所以说容器之间的争斗,docker是胜利的;

15年,各种厂商都开始开发容器,docker、rkt、pouch、lxc等等,docker inc公司带头开源容器提议,将镜像与运行时进行规范,让其他产品的镜像docker能用,docker的镜像其他产品也能使用;

16年,k8s提倡了CRI提议(Container Runtime Interface),只要满足CRI开发规范结构的容器管理工具,就可以在k8s集群上运行;

17年,docker-swarm市场占有率极低,被k8s打败!Containerd 最初是 Docker 引擎的低层运行管理器。在2017年3月被 CNCF (云原生计算基金会)接受,现如今 Containerd 已经成为行业标准的容器运行引擎;

18年,coreOS被RedHat收购;

19年,docker inc被Mirantis收购,Mirantis之前搞openstack的,现在搞云计算,说对docker-swarm维护2年,后期重心放在k8s,但是现在docker-swarm也能用,只是用的人很了,当时k8s在国内的也逐渐火起来了,k8s称为了云原生的实施标准,基本上能够称为云原生的代名词,就好像hadoop能够成为大数据的代名词。但是并不代表云原生就是k8s哈,云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法,是一套技术体系和方法论,里面包含几百上千的软件,根本学不完,只能是用到啥学啥;

20年,k8s在1.21版本弃用docker-shim;

22年,k8s1.24版本诞生,docker不再是默认的运行时,而是使用containerd作为默认运行时;

23年,到今天,k8s已经更新到1.27版本了。

补充,rancher开发了轻量级的k8s,叫k3s;CNI是Container Netwrok Interface,类似CRI,只要是符合CNI开发规范接口的网络插件,均能在K8S运行,Flannel是开源的CNI插件,擅长网络通信,还有Calico,擅长网络策略与网络通信,两个相比,Flannel的通用性要更强一些。

K8s的组件架构概述(手撕架构图)

K8s有很多组件,这些组件一起构成K8s集群,了解组件前先了解两个身份,在之前控制面板和工作节点分别叫master和slave,后来因为某些原因,更名为controller plane和worker node。

在控制面板上有etcd负责存储(单独的组件,k8s拿来用的,也是golang开发的),api-server是集群访问入门,scheduler负责pod调度,有很多种调度算法,controller manager是控制器,监控集群状态并对其调整维护;

在工作节点上有kubelet负责pod的生命周期管理,pod在kubelet中负责存放容器,并监控当前节点的状态上报给api-server,还有kube-proxy负责pod的访问路由。

K8s中一切皆资源,就好比Linux中一切皆文件一样,按照上面组件概述,我们来画出架构图。

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第1张图片

K8s生产环境中部署的方式

我计划准备四台Centos7,一台作为Master,两台作为worker,一台作为harbor,harbor单点即可,做https,之前文章写过,比较简单,不再赘述。

注意的是,K8s的集群部署前后需要做好快照,因为这个部署比其他软件要复杂的多,稍有不慎集群就起不来。

10.0.0.231 master231
10.0.0.232 worker232
10.0.0.233 worker233
10.0.0.250 harbor.oldboyedu.com

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第2张图片

根据上面的图部署组件,可以使用kubeadm部署方式我们去进行K8s的集群部署,先部署出docker等环境。

一、Docker及系统环境部署

docker节点和harbor都需要操作

1、准备系统环境

参考链接:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

2、关闭swap分区,也可以做系统的时候不去分配

# 临时关闭
swapoff -a && sysctl -w vm.swappiness=0  
# 基于配置文件关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab  

3、确保各个节点的MAC地址product_uuid唯一

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。

ifconfig  eth0  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid 

4、检查网络节点是否互通

就是判断k8s集群的各个节点是否互通,可以使用ping测试

5、允许iptable检查桥接流量

cat <

6、检查端口是否被占用

ss -ntl查看即可

参考链接:端口和协议 | Kubernetes

7、检查docker环境

之前文章写过用脚本快速部署,可见【运维知识大神篇】运维人必学的Docker教程5(Namespace+Cgroup+OverlayFS原理详解+自定义镜像日志输出+Docker优劣势+Docker-compose安装+脚本自动部署)_我是koten的博客-CSDN博客

yum -y install wget
tar xf koten-docker-20.10.tar.gz
./install-docker.sh instal
source /usr/share/bash-completion/completions/docker

8、禁用防火墙

systemctl disable --now firewalld

9、禁用selinux

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config 
grep ^SELINUX= /etc/selinux/config

10、配置hosts解析

cat >> /etc/hosts <<'EOF'
10.0.0.231 master231
10.0.0.232 worker232
10.0.0.233 worker233
10.0.0.250 harbor.koten.com
EOF
cat /etc/hosts

11、所有节点创建自定义证书目录

mkdir -pv /etc/docker/certs.d/harbor.koten.com

二、harbor部署

只需要harbor主机部署,之前也写过文章,可见【运维知识大神篇】运维人必学的Docker教程6(Docker-Compose使用详解+Linux特性管理+macvlan技术+大规模跨主机通信overlay+私有仓库harbor部署使用)_我是koten的博客-CSDN博客

1、解压harbor软件包

[root@Harbor250 ~]# tar xf koten-harbor.tar.gz -C /koten/softwares/

2、安装harbor

[root@Harbor250 ~]# cd /koten/softwares/harbor/
[root@Harbor250 harbor]# 
[root@Harbor250 harbor]# ./install.sh 

3、将客户端证书推送至所有的k8s集群

[root@Harbor250 harbor]# scp certs/custom/client/* master231:/etc/docker/certs.d/harbor.koten.com/  
[root@Harbor250 harbor]# 
[root@Harbor250 harbor]# scp certs/custom/client/* worker232:/etc/docker/certs.d/harbor.koten.com/
[root@Harbor250 harbor]# 
[root@Harbor250 harbor]# scp certs/custom/client/* worker233:/etc/docker/certs.d/harbor.koten.com/

5、挑选任意k8s节点,测试harbor能否正常访问

[root@Master231 ~]# docker login -u admin -p 1 harbor.koten.com
.....

Login Succeeded
[root@Master231 ~]# 

三、所有节点安装kubeadm,kubelet,kubectl

参考链接:在 Linux 系统中安装并设置 kubectl | Kubernetes

需要在每台机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动Pod和容器等。
kubectl:用来与集群通信的命令行工具。

kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制面板(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 

然而,控制面板与kubelet间的相差一个次要版本不一致是支持的,但kubelet的版本不可以超过"API SERVER"的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的"API SERVER",反之则不可以。

1、所有节点安装kubeadm,kubelet,kubectl,配置软件源

cat  > /etc/yum.repos.d/kubernetes.repo <

2、查看kubeadm的版本,将来你要安装的k8s时请所有组件版本保持一致

yum -y list kubeadm --showduplicates | sort -r

3、安装kubeadm,kubelet,kubectl软件包

yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

4、启动kubelet服务,若服务启动失败是正常现象,会自动重启,因为缺失配置文件,初始化集群后就恢复正常了,推荐设置开机自启动

systemctl enable --now kubelet
systemctl status kubelet

四、初始化master节点

1、使用kubeadm初始化master节点

初始化后会自动下载镜像,记得记录初始化完毕的内容,信息里会显示在worker节点加入主节点的命令,就是带token和sha256的一行

kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers  --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16  --service-dns-domain=koten.com

相关参数说明

	--kubernetes-version:
		指定K8S master组件的版本号。
		
	--image-repository:
		指定下载k8s master组件的镜像仓库地址。
		
	--pod-network-cidr:
		指定Pod的网段地址。
		
	--service-cidr:
		指定SVC的网段

	--service-dns-domain:
		指定service的域名。若不指定,默认为"cluster.local"。
		

使用kubeadm初始化集群时,可能会出现如下的输出信息:
[init] 
	使用初始化的K8S版本。
	
[preflight] 
	主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。

[certs] 
	生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。

[kubeconfig]
	生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。

[kubelet-start] 
	启动kubelet,
    环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env"
    配置文件默认写入:"/var/lib/kubelet/config.yaml"

[control-plane]
	使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。
	此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler"

[etcd] 
	创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests"
	
[wait-control-plane] 
	等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。

[apiclient]
	等待所有的master组件正常运行。
	
[upload-config] 
	创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。
	
[kubelet] 
	创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置

[upload-certs] 
	跳过此节点,详情请参考”--upload-certs"
	
[mark-control-plane]
	标记控制面板,包括打标签和污点,目的是为了标记master节点。
	
[bootstrap-token] 
	创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。
	如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。

[kubelet-finalize] 
	更新kubelet的证书文件信息

[addons] 
	添加附加组件,例如:"CoreDNS"和"kube-proxy”

2、拷贝授权文件,用于管理k8s集群

[root@Master231 ~]# mkdir -p $HOME/.kube
[root@Master231 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@Master231 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

3、查看master组件信息

[root@Master231 ~]# kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok                              
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}   
[root@Master231 ~]# 
[root@Master231 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}   
scheduler            Healthy   ok                              
[root@Master231 ~]# 

五、配置所有worker节点加入镜像

1、加入集群

直接复制master初始化时给的提示信息那条命令即可,加入集群同样会下载镜像

[root@worker232 ~]# kubeadm join 10.0.0.231:6443 --token pljeu9.oynjqw13j1m7xyvb \
	--discovery-token-ca-cert-hash sha256:3e6dbfe55cbda949a1861fc223babf746c2742cf9069703bc163032e91d375ac

[root@worker233 ~]# kubeadm join 10.0.0.231:6443 --token pljeu9.oynjqw13j1m7xyvb \
	--discovery-token-ca-cert-hash sha256:3e6dbfe55cbda949a1861fc223babf746c2742cf9069703bc163032e91d375ac

2、master查看集群节点数量

[root@Master231 ~]# kubectl get no    #kubectl get nodes也可以,是全称
NAME        STATUS     ROLES                  AGE     VERSION
Master231   NotReady   control-plane,master   22m     v1.23.17
worker232   NotReady                    6m15s   v1.23.17
worker233   NotReady                    6m11s   v1.23.17
[root@Master231 ~]# 

六、配置自动补全功能

[root@Master231 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc 
[root@Master231 ~]# 
[root@Master231 ~]# kubectl 
alpha          auth           cordon         diff           get            patch          run            version
annotate       autoscale      cp             drain          help           plugin         scale          wait
api-resources  certificate    create         edit           kustomize      port-forward   set            
api-versions   cluster-info   debug          exec           label          proxy          taint          
apply          completion     delete         explain        logs           replace        top            
attach         config         describe       expose         options        rollout        uncordon       
[root@Master231 ~]# 

七、安装CNI插件并测试集群

每个节点都需要部署CNI插件,并不是只有Master需要有

1、下载插件的配置文件

[root@Master231 ~]# mkdir /manifests/cni
[root@Master231 ~]# 
[root@Master231 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml -O /manifests/cni/kube-flannel.yml

2、修改配置文件

[root@Master231 ~]# vim /manifests/cni/kube-flannel.yml
...
	将
		"Network": "10.244.0.0/16",
	修改为:
      "Network": "10.100.0.0/16",

3、安装flannel插件

此命令会自动下载镜像

[root@Master231 ~]# kubectl apply -f /manifests/cni/kube-flannel.yml 

4、验证网络插件是否部署成功

[root@Master231 ~]# kubectl -n kube-flannel get pods
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-btrqw   1/1     Running   0          5m14s
kube-flannel-ds-krq6g   1/1     Running   0          5m14s
kube-flannel-ds-mh2q7   1/1     Running   0          5m14s
[root@Master231 ~]# 
[root@Master231 ~]# kubectl get nodes
NAME        STATUS   ROLES                  AGE   VERSION
Master231   Ready    control-plane,master   91m   v1.23.17
worker232   Ready                     75m   v1.23.17
worker233   Ready                     74m   v1.23.17
[root@Master231 ~]# 
[root@Master231 ~]# kubectl -n kube-flannel get pods -o wide    
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
kube-flannel-ds-btrqw   1/1     Running   0          18m   10.0.0.231   Master231              
kube-flannel-ds-krq6g   1/1     Running   0          18m   10.0.0.232   worker232              
kube-flannel-ds-mh2q7   1/1     Running   0          18m   10.0.0.233   worker233              
[root@Master231 ~]# 

5、推送测试镜像到harbor

需要先在harbor上创建koten-linux的项目

[root@Master231 ~]# docker login -u admin -p 1 harbor.koten.com
[root@Master231 ~]# 
[root@Master231 ~]# docker tag alpine harbor.koten.com/koten-linux/alpine
[root@Master231 ~]# 
[root@Master231 ~]# docker push harbor.koten.com/koten-linux/alpine
Using default tag: latest
The push refers to repository [harbor.koten.com/koten-linux/alpine]
8d3ac3489996: Pushed 
latest: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
[root@Master231 ~]# 

6、启动Pod测试

编写资源清单,运行清单,会启动两台主机上的容器,通过pod名称可以在master节点上运行worker节点上容器里的命令,工作节点会在harbor拉取,不管本地有没有镜像,harbor拉取不下来就报错

[root@Master231 ~]# mkdir /manifests/pod
[root@Master231 ~]# 
[root@Master231 ~]# cat /manifests/pod/01-flannel-test.yaml
# 指定apiserver版本号
apiVersion: v1
# 指定资源的类型
kind: Pod
# 定义源数据信息
metadata:
  # Pod的名称
  name: pod-c1
# 用户定义资源期望运行的状态
spec:
  # 指定在worker232的工作节点运行
  nodeName: worker232    #注意此处不能填写IP,必须是在我们master上加入的工作节点才行
  # 在Pod内运行的容器定义
  containers:
    # 容器的名称
  - name: c1
    # 镜像名称
    image: harbor.koten.com/koten-linux/alpine:latest
    # 相当于Dockerfile的ENTRYPOINT指令,指定容器运行的命令
    command: ["tail","-f","/etc/hosts"]

---

apiVersion: v1
kind: Pod
metadata:
  name: pod-c2
spec:
  nodeName: worker233
  containers:
  - name: c2
    image: harbor.koten.com/koten-linux/alpine:latest
    command: ["sleep","3600"]
[root@Master231 ~]# 
[root@Master231 ~]# kubectl apply -f /manifests/pod/01-flannel-test.yaml
pod/pod-c1 created
pod/pod-c2 created
[root@Master231 ~]# 
[root@Master231 ~]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
pod-c1   1/1     Running   0          8s    10.100.1.2   worker232              
pod-c2   1/1     Running   0          8s    10.100.2.2   worker233              
[root@Master231 ~]# 
[root@Master231 ~]# kubectl exec pod-c1 -- ifconfig
eth0      Link encap:Ethernet  HWaddr 5A:A2:BF:B2:97:35  
          inet addr:10.100.1.2  Bcast:10.100.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:15 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1222 (1.1 KiB)  TX bytes:420 (420.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@Master231 ~]# 
[root@Master231 ~]# kubectl exec pod-c1 -- ping 10.100.2.2 -c 3
PING 10.100.2.2 (10.100.2.2): 56 data bytes
64 bytes from 10.100.2.2: seq=0 ttl=62 time=0.872 ms
64 bytes from 10.100.2.2: seq=1 ttl=62 time=0.318 ms
64 bytes from 10.100.2.2: seq=2 ttl=62 time=0.340 ms

--- 10.100.2.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.318/0.510/0.872 ms
[root@Master231 ~]# 

资源管理

1、推送镜像到harbor仓库

先在harbor上创建koten-web的项目

[root@Master231 pod]# docker pull nginx:1.25.1-alpine
[root@Master231 pod]# docker pull nginx:1.24.0-alpine
[root@Master231 pod]# docker tag nginx:1.25.1-alpine harbor.koten.com/koten-web/nginx:1.25.1-alpine
[root@Master231 pod]# docker push harbor.koten.com/koten-web/nginx:1.25.1-alpine
[root@Master231 pod]# docker tag nginx:1.24.0-alpine harbor.koten.com/koten-web/nginx:1.24.0-alpine
[root@Master231 pod]# docker push harbor.koten.com/koten-web/nginx:1.24.0-alpine

2、查看所有的资源

[root@Master231 ~]# kubectl api-resources 

3、编写资源清单

[root@Master231 pod]# cat 02-pods-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: linux-web
spec:
  containers:
  - name: web
    image: harbor.koten.com/koten-web/nginx:1.24.0-alpine
[root@Master231 pod]# 

4、创建资源

create参数如果资源已经创建了会提示资源已存在

[root@Master231 pod]# kubectl create -f 02-pods-nginx.yaml 
pod/linux-web created
[root@Master231 pod]# 

5、查看IP地址并访问

通过curl -I可以查看返回协议头

[root@Master231 pod]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
linux-web   1/1     Running   0          82s   10.100.2.4   worker233              
[root@Master231 pod]# 
[root@Master231 pod]# 
[root@Master231 pod]# curl -I  10.100.2.4
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Wed, 14 Jun 2023 09:55:02 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 11 Apr 2023 17:21:57 GMT
Connection: keep-alive
ETag: "64359735-267"
Accept-Ranges: bytes

[root@Master231 pod]# 

6、修改资源清单的配置文件

修改资源清单,通过apply参数提交,apply会修改配置文件内容,重新启动pod,再次访问可以看到镜像发生变化

[root@Master231 pod]# cat 02-pods-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: linux-web
spec:
  containers:
  - name: web
    # image: harbor.koten.com/koten-web/nginx:1.24.0-alpine
    image: harbor.koten.com/koten-web/nginx:1.25.1-alpine
[root@Master231 pod]# 
[root@Master231 pod]# kubectl apply -f 02-pods-nginx.yaml 
pod/linux-web configured
[root@Master231 pod]# 
[root@Master231 pod]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS     AGE     IP           NODE        NOMINATED NODE   READINESS GATES
linux-web   1/1     Running   1 (4s ago)   4m46s   10.100.2.4   worker233              
[root@Master231 pod]# 
[root@Master231 pod]# 
[root@Master231 pod]# curl -I  10.100.2.4
HTTP/1.1 200 OK
Server: nginx/1.25.1
Date: Wed, 14 Jun 2023 09:58:24 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 13 Jun 2023 17:34:28 GMT
Connection: keep-alive
ETag: "6488a8a4-267"
Accept-Ranges: bytes

[root@Master231 pod]# 

7、删除pod资源

[root@Master231 pod]# kubectl get pods
NAME          READY   STATUS    RESTARTS        AGE
linux-web   1/1     Running   1 (2m39s ago)   7m21s
[root@Master231 pod]# 
[root@Master231 pod]# 
[root@Master231 pod]# kubectl delete -f 02-pods-nginx.yaml 
pod "linux-web" deleted
[root@Master231 pod]# 
[root@Master231 pod]# kubectl get pods
No resources found in default namespace.
[root@Master231 pod]# 
[root@Master231 pod]# kubectl delete pods --all    #慎用!离职小技巧!
No resources found in default namespace.
[root@Master231 pod]# 

8、删除启动失败的pod

[root@Master231 pod]# kubectl get pods
NAME     READY   STATUS    RESTARTS      AGE
pod-c1   1/1     Running   0             6h18m
pod-c2   1/1     Running   6 (11m ago)   6h18m
[root@Master231 pod]# kubectl delete -f 01-flannel-test.yaml 
pod "pod-c1" deleted
pod "pod-c2" deleted

^C
[root@Master231 pod]# kubectl get pods
NAME     READY   STATUS        RESTARTS      AGE
pod-c1   1/1     Terminating   0             6h18m
pod-c2   1/1     Terminating   6 (11m ago)   6h18m
[root@Master231 pod]# kubelet delete pods pod-c1
[root@Master231 pod]# kubelet delete pods pod-c2
[root@Master231 pod]# kubectl get pods
No resources found in default namespace.

9、让windows访问pod

修改资源清单,加配置参数 hostNetwork:true 即可

注意,这种情况下,已经有了pod,再次apply资源清单会报错,所以需要先删除pod资源,再apply启动pod

[root@Master231 pod]# cat 02-pods-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: linux86-web
spec:
  hostNetwork: true
  containers:
  - name: web
    image: harbor.koten.com/koten-web/nginx:1.25.1-alpine
[root@Master231 pod]# 
[root@Master231 pod]# kubectl apply -f 02-pods-nginx.yaml 
pod/linux-web created
[root@Master231 pod]# 
[root@Master231 pod]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
linux-web   1/1     Running   0          5s    10.0.0.232   worker232              
[root@Master231 pod]# 
[root@Master231 pod]# curl -I 10.0.0.232
HTTP/1.1 200 OK
Server: nginx/1.25.1
Date: Wed, 14 Jun 2023 10:03:18 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 13 Jun 2023 17:34:28 GMT
Connection: keep-alive
ETag: "6488a8a4-267"
Accept-Ranges: bytes

[root@Master231 pod]# 

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第3张图片

实战练习

一、推送游戏镜像至k8s集群

我之前在网上找的游戏镜像可以导入进去

1、导入镜像,打标签,上传镜像至私有harbor

[root@Master231 pod]# docker load -i games_v0.4.tar.gz
[root@Master231 pod]# docker tag jasonyin2020/oldboyedu-games:v0.4 harbor.koten.com/koten-web/games:v1.0 
[root@Master231 pod]# docker push harbor.koten.com/koten-web/games:v1.0

2、编写资源清单

使容器中的80端口映射到宿主机的8080上

[root@Master231 pod]# cat 03-pods-games.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: games
spec:
  containers:
  - name: games
    image: harbor.koten.com/koten-web/games:v1.0
    ports:
    - protocol: TCP
      containerPort: 80
      name: http
      hostPort: 8080

3、运行资源清单,创建pod

master主节点可以通过curl通10.100.1.5,但是浏览器访问需要宿主机加端口

[root@Master231 pod]# kubectl apply -f 03-pods-games.yaml 
pod/games created
[root@Master231 pod]# kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
games   1/1     Running   0          55s   10.100.1.5   worker232              

4、浏览器通过10.0.0.232:8080访问

windows经过hosts解析后,还可以访问其他游戏,这个就看镜像里面nginx咋写的了

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第4张图片

二、推送wordpress至k8s集群

也可以自己做镜像哈,我这边采取拉去官方镜像的办法

1、拉取官方镜像,打标签上传镜像至私有harbor

用koten-web项目即可,刚刚已经创建过了

[root@Master231 pod]# docker pull wordpress
[root@Master231 pod]# docker tag wordpress:latest harbor.koten.com/koten-web/wordpress:v1.0
[root@Master231 pod]# docker push harbor.koten.com/koten-web/wordpress:v1.0

2、编写资源清单

[root@Master231 pod]# cat 04-pods-wordpress.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress
spec:
  hostNetwork: true
  containers:
  - name: wordpress
    image: harbor.koten.com/koten-web/wordpress:v1.0

3、运行资源清单,创建pod

[root@Master231 pod]# kubectl apply -f 04-pods-wordpress.yaml 
pod/wordpress created
[root@Master231 pod]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
wordpress   1/1     Running   0          19s   10.0.0.232   worker232              

4、通过10.0.0.232访问,但是部署发现,我们不知道mysql账号密码,进wordpress容器后发现mysql命令也执行不了,所以我们还需要部署下mysql

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第5张图片

5、拉去mysql镜像,打标签,推送镜像到本地仓库

本地仓库先创建koten-db项目

[root@Master231 pod]# docker pull mysql:5.7
[root@Master231 pod]# docker tag mysql:5.7 harbor.koten.com/koten-db/mysql:5.7
[root@Master231 pod]# docker push harbor.koten.com/koten-db/mysql:5.7

6、编写资源清单

[root@Master231 pod]# cat 04-pods-mysql.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress-db
spec:
  containers: 
  - name: db
    image: harbor.koten.com/koten-db/mysql:5.7
    # 向容器传递环境变量
    env:
      # 变量的名称
    - name: MYSQL_ALLOW_EMPTY_PASSWORD
      # 指定变量的值
      value: "yes"
    - name: MYSQL_DATABASE
      value: "wordpress"
    - name: MYSQL_USER
      value: "admin"
    - name: MYSQL_PASSWORD
      value: "123"

7、测试mysql创建资源

[root@Master231 pod]# kubectl apply -f 04-pods-mysql.yaml 
pod/wordpress-db created

8、查看资源并验证Pod,发现里面确实创建了数据库与用户

[root@Master231 pod]# kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
wordpress-db   1/1     Running   0          38s
[root@Master231 pod]# kubectl exec -it wordpress-db -- mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

mysql> SELECT user,host FROM mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| admin         | %         |
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)

mysql> exit
Bye
[root@Master231 pod]# 

9、将mysql资源清单合并进wordpress资源清单,并在wordpress资源清单调用参数

[root@Master231 pod]# cat 04-pods-wordpress.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress
spec:
  hostNetwork: true
  containers: 
  - name: db
    image: harbor.koten.com/koten-db/mysql:5.7
    # 向容器传递环境变量
    env:
      # 变量的名称
    - name: MYSQL_ALLOW_EMPTY_PASSWORD
      # 指定变量的值
      value: "yes"
    - name: MYSQL_DATABASE
      value: "wordpress"
    - name: MYSQL_USER
      value: "admin"
    - name: MYSQL_PASSWORD
      value: "123"

  - name: wordpress
    image: harbor.koten.com/koten-web/wordpress:v1.0
    env:
    - name: WORDPRESS_DB_HOST
      # 指定变量的值
      value: "127.0.0.1"
    - name: WORDPRESS_DB_NAME
      value: "wordpress"
    - name: WORDPRESS_DB_USER
      value: "admin"
    - name: WORDPRESS_DB_PASSWORD
      value: "123"  

10、运行资源清单

之前READY是1,现在变成2了

[root@Master231 pod]# kubectl apply -f 04-pods-wordpress.yaml 
pod/wordpress created
[root@Master231 pod]# kubectl get pods 
NAME        READY   STATUS    RESTARTS   AGE
wordpress   2/2     Running   0          5s

11、浏览器访问,部署wordpress业务

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第6张图片

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第7张图片

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第8张图片

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第9张图片

【运维知识大神篇】运维界的超神器Kubernetes教程1(组件架构概述+手撕架构图+生产环境部署K8s+ 部署Flannel的CNI插件+K8s集群资源清单编写+部署游戏和博客镜像上K8s集群实战)_第10张图片


这篇文章真是太难了,都剩两个实战项目就写完了,我改了张图片,内容突然回滚到只剩下5000字了,我真是服了!!!

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

你可能感兴趣的:(#,大神运维知识,运维知识分享,运维,kubernetes,容器,Pod,kubeadm,Flannel,docker)