本篇文章开始给大家介绍Kubernetes的内容,听我朋友说现在10个人的团队都在研究项目上K8s了,可见其趋势和重要性,招聘岗位一搜,Linux云计算运维,百分之八九十都要求会K8s的,所以学好它至关重要,里面内容之多,逻辑之复杂,也不是别的工具能相比的,不多说了,开始今天的内容。
目录
K8s和Docker爱恨情仇
K8s的组件架构概述(手撕架构图)
K8s生产环境中部署的方式
一、Docker及系统环境部署
二、harbor部署
三、所有节点安装kubeadm,kubelet,kubectl
四、初始化master节点
五、配置所有worker节点加入镜像
六、配置自动补全功能
七、安装CNI插件并测试集群
资源管理
实战练习
一、推送游戏镜像至k8s集群
二、推送wordpress至k8s集群
官网链接: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集群,了解组件前先了解两个身份,在之前控制面板和工作节点分别叫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中一切皆文件一样,按照上面组件概述,我们来画出架构图。
我计划准备四台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
根据上面的图部署组件,可以使用kubeadm部署方式我们去进行K8s的集群部署,先部署出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主机部署,之前也写过文章,可见【运维知识大神篇】运维人必学的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 ~]#
参考链接:在 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
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 ~]#
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插件,并不是只有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]#
我之前在网上找的游戏镜像可以导入进去
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咋写的了
也可以自己做镜像哈,我这边采取拉去官方镜像的办法
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
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业务
这篇文章真是太难了,都剩两个实战项目就写完了,我改了张图片,内容突然回滚到只剩下5000字了,我真是服了!!!
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!