本篇文章开始给大家介绍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中一切皆文件一样,按照上面组件概述,我们来画出架构图。
K8s生产环境中部署的方式
我计划准备四台Centos7,一台作为Master,两台作为worker,一台作为harbor,harbor单点即可,做https,之前文章写过,比较简单,不再赘述。
注意的是,K8s的集群部署前后需要做好快照,因为这个部署比其他软件要复杂的多,稍有不慎集群就起不来。
10.0.0.231 master23110.0.0.232 worker23210.0.0.233 worker23310.0.0.250 harbor.oldboyedu.com
根据上面的图部署组件,可以使用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使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
ifconfigeth0| grep ether | awk '{print $2}'cat /sys/class/dmi/id/product_uuid
4、检查网络节点是否互通
就是判断k8s集群的各个节点是否互通,可以使用ping测试
5、允许iptable检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system
6、检查端口是否被占用
ss -ntl查看即可
参考链接:端口和协议 | Kubernetes
7、检查docker环境
之前文章写过用脚本快速部署,可见【运维知识大神篇】运维人必学的Docker教程5(Namespace+Cgroup+OverlayFS原理详解+自定义镜像日志输出+Docker优劣势+Docker-compose安装+脚本自动部署)_我是koten的博客-CSDN博客
下面用到的压缩包我也提供下载链接了,放在文末。
yum -y install wgetunzip koten-docker-install.zipsh deploy_docker.sh installsource /usr/share/bash-completion/completions/docker# 注意docker配置文件,需要让docker的cgroup驱动与kubelet的cgroup驱动保持一致# 看下docker配置文件有没有指定为systemd,没有的话执行下下面操作> /etc/docker/daemon.jsoncat >> /etc/docker/daemon.json <<'EOF'{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]}EOFsystemctl restart 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 master23110.0.0.232 worker23210.0.0.233 worker23310.0.0.250 harbor.koten.comEOFcat /etc/hosts
11、所有节点创建自定义证书目录
mkdir -pv /etc/docker/certs.d/harbor.koten.com
12、所有节点开启IP转发
#临时生效sysctl -w net.ipv4.ip_forward=1#永久生效echo net.ipv4.ip_forward=1 >> /etc/sysctl.confsysctl -p
二、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 <<EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0repo_gpgcheck=0EOF
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 kubeletsystemctl status kubelet
四、初始化master节点
1、使用kubeadm初始化master节点
初始化后会自动下载镜像,记得记录初始化完毕的内容,信息里会显示在worker节点加入主节点的命令,就是带token和sha256的一行
注意,该命令只在一个节点执行,如果你想做多个master的话需要在一个节点执行后,其他节点加入进此集群。
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 componentstatusesWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUSMESSAGE ERRORschedulerHealthy okcontroller-manager Healthy oketcd-0 Healthy {"health":"true","reason":""} [root@Master231 ~]# [root@Master231 ~]# kubectl get csWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUSMESSAGE ERRORcontroller-manager Healthy oketcd-0 Healthy {"health":"true","reason":""} schedulerHealthy 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# 如果是master节点加入集群 需执行以下操作# 在初始化的master节点执行下面命令获取keykubeadm init phase upload-certs--upload-certs# 在想加入的master节点执行下面命令kubeadm join 10.0.0.231:6443 --token pljeu9.oynjqw13j1m7xyvb \--discovery-token-ca-cert-hash sha256:3e6dbfe55cbda949a1861fc223babf746c2742cf9069703bc163032e91d375ac \--control-plane --certificate-key # 如果执行加入集群命令提示下面报错信息One or more conditions for hosting a new control plane instance is not satisfied# 需要在初始化节点操作kubectl -n kube-system edit cm kubeadm-config# 在线编辑进去后,添加下面信息,添加到kubernetesVersion的同级字段即可controlPlaneEndpoint: "10.0.0.231:6443"
2、master查看集群节点数量
[root@Master231 ~]# kubectl get no#kubectl get nodes也可以,是全称NAMESTATUS ROLESAGE VERSIONMaster231 NotReady control-plane,master 22m v1.23.17worker232 NotReady 6m15s v1.23.17worker233 NotReady 6m11s v1.23.17[root@Master231 ~]#
六、配置自动补全功能
[root@Master231 ~]# echo "source > ~/.bashrc && source ~/.bashrc [root@Master231 ~]# [root@Master231 ~]# kubectl alphaauth cordon diff getpatchrunversionannotate autoscalecp drainhelp plugin scalewaitapi-resourcescertificatecreate edit kustomizeport-forward setapi-versions cluster-info debugexec labelproxytaintapplycompletion delete explainlogs replacetopattach config describe expose optionsrolloutuncordon [root@Master231 ~]#
七、安装CNI插件并测试集群
每个节点都需要部署CNI插件,并不是只有Master需要有
1、下载插件的配置文件
[root@Master231 ~]# mkdir /manifests/cni -p[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 podsNAMEREADY STATUSRESTARTS AGEkube-flannel-ds-btrqw 1/1 Running 05m14skube-flannel-ds-krq6g 1/1 Running 05m14skube-flannel-ds-mh2q7 1/1 Running 05m14s[root@Master231 ~]# [root@Master231 ~]# kubectl get nodesNAMESTATUS ROLESAGE VERSIONMaster231 Readycontrol-plane,master 91m v1.23.17worker232 Ready 75m v1.23.17worker233 Ready 74m v1.23.17[root@Master231 ~]# [root@Master231 ~]# kubectl -n kube-flannel get pods -o wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESkube-flannel-ds-btrqw 1/1 Running 018m 10.0.0.231 Master231 kube-flannel-ds-krq6g 1/1 Running 018m 10.0.0.232 worker232 kube-flannel-ds-mh2q7 1/1 Running 018m 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/alpineUsing default tag: latestThe 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 -p[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: v1kind: Podmetadata:name: pod-c2spec:nodeName: worker233containers:- name: c2image: harbor.koten.com/koten-linux/alpine:latestcommand: ["sleep","3600"][root@Master231 ~]# [root@Master231 ~]# kubectl apply -f /manifests/pod/01-flannel-test.yamlpod/pod-c1 createdpod/pod-c2 created[root@Master231 ~]# [root@Master231 ~]# kubectl get pods -o wideNAME READY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESpod-c1 1/1 Running 08s10.100.1.2 worker232 pod-c2 1/1 Running 08s10.100.2.2 worker233 [root@Master231 ~]# [root@Master231 ~]# kubectl exec pod-c1 -- ifconfigeth0Link encap:EthernetHWaddr 5A:A2:BF:B2:97:35inet addr:10.100.1.2Bcast:10.100.1.255Mask:255.255.255.0UP BROADCAST RUNNING MULTICASTMTU:1450Metric:1RX packets:15 errors:0 dropped:0 overruns:0 frame:0TX packets:6 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:1222 (1.1 KiB)TX bytes:420 (420.0 B)loLink encap:Local Loopbackinet addr:127.0.0.1Mask:255.0.0.0UP LOOPBACK RUNNINGMTU:65536Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions: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 3PING 10.100.2.2 (10.100.2.2): 56 data bytes64 bytes from 10.100.2.2: seq=0 ttl=62 time=0.872 ms64 bytes from 10.100.2.2: seq=1 ttl=62 time=0.318 ms64 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 lossround-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: v1kind: Podmetadata:name: linux-webspec:containers:- name: webimage: 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 wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESlinux-web 1/1 Running 082s 10.100.2.4 worker233 [root@Master231 pod]# [root@Master231 pod]# [root@Master231 pod]# curl -I10.100.2.4HTTP/1.1 200 OKServer: nginx/1.24.0Date: Wed, 14 Jun 2023 09:55:02 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Tue, 11 Apr 2023 17:21:57 GMTConnection: keep-aliveETag: "64359735-267"Accept-Ranges: bytes[root@Master231 pod]#
6、修改资源清单的配置文件
修改资源清单,通过apply参数提交,apply会修改配置文件内容,重新启动pod,再次访问可以看到镜像发生变化
[root@Master231 pod]# cat 02-pods-nginx.yaml apiVersion: v1kind: Podmetadata:name: linux-webspec:containers:- name: web# image: harbor.koten.com/koten-web/nginx:1.24.0-alpineimage: 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 wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESlinux-web 1/1 Running 1 (4s ago) 4m46s 10.100.2.4 worker233 [root@Master231 pod]# [root@Master231 pod]# [root@Master231 pod]# curl -I10.100.2.4HTTP/1.1 200 OKServer: nginx/1.25.1Date: Wed, 14 Jun 2023 09:58:24 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Tue, 13 Jun 2023 17:34:28 GMTConnection: keep-aliveETag: "6488a8a4-267"Accept-Ranges: bytes[root@Master231 pod]#
7、删除pod资源
[root@Master231 pod]# kubectl get podsNAMEREADY STATUSRESTARTSAGElinux-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 podsNo 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 podsNAME READY STATUSRESTARTSAGEpod-c1 1/1 Running 0 6h18mpod-c2 1/1 Running 6 (11m ago) 6h18m[root@Master231 pod]# kubectl delete -f 01-flannel-test.yaml pod "pod-c1" deletedpod "pod-c2" deleted^C[root@Master231 pod]# kubectl get podsNAME READY STATUSRESTARTSAGEpod-c1 1/1 Terminating 0 6h18mpod-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 podsNo resources found in default namespace.
9、让windows访问pod
修改资源清单,加配置参数 hostNetwork:true 即可
注意,这种情况下,已经有了pod,再次apply资源清单会报错,所以需要先删除pod资源,再apply启动pod
[root@Master231 pod]# cat 02-pods-nginx.yamlapiVersion: v1kind: Podmetadata:name: linux86-webspec:hostNetwork: truecontainers:- name: webimage: 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 wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESlinux-web 1/1 Running 05s10.0.0.232 worker232 [root@Master231 pod]# [root@Master231 pod]# curl -I 10.0.0.232HTTP/1.1 200 OKServer: nginx/1.25.1Date: Wed, 14 Jun 2023 10:03:18 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Tue, 13 Jun 2023 17:34:28 GMTConnection: keep-aliveETag: "6488a8a4-267"Accept-Ranges: bytes[root@Master231 pod]#
实战练习
一、推送游戏镜像至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: v1kind: Podmetadata:name: gamesspec:containers:- name: gamesimage: harbor.koten.com/koten-web/games:v1.0ports:- protocol: TCPcontainerPort: 80name: httphostPort: 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 wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESgames 1/1 Running 055s 10.100.1.5 worker232
4、浏览器通过10.0.0.232:8080访问
windows经过hosts解析后,还可以访问其他游戏,这个就看镜像里面nginx咋写的了
二、推送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.yamlapiVersion: v1kind: Podmetadata:name: wordpressspec:hostNetwork: truecontainers:- name: wordpressimage: 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 wideNAMEREADY STATUSRESTARTS AGE IP NODENOMINATED NODE READINESS GATESwordpress 1/1 Running 019s 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.yamlapiVersion: v1kind: Podmetadata:name: wordpress-dbspec:containers: - name: dbimage: harbor.koten.com/koten-db/mysql:5.7# 向容器传递环境变量env:# 变量的名称- name: MYSQL_ALLOW_EMPTY_PASSWORD# 指定变量的值value: "yes"- name: MYSQL_DATABASEvalue: "wordpress"- name: MYSQL_USERvalue: "admin"- name: MYSQL_PASSWORDvalue: "123"
7、测试mysql创建资源
[root@Master231 pod]# kubectl apply -f 04-pods-mysql.yaml pod/wordpress-db created
8、查看资源并验证Pod,发现里面确实创建了数据库与用户
[root@Master231 pod]# kubectl get podsNAME READY STATUSRESTARTS AGEwordpress-db 1/1 Running 038s[root@Master231 pod]# kubectl exec -it wordpress-db -- mysqlWelcome to the MySQL monitor.Commands end with ; or \g.Your MySQL connection id is 2Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners.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> exitBye[root@Master231 pod]#
9、将mysql资源清单合并进wordpress资源清单,并在wordpress资源清单调用参数
[root@Master231 pod]# cat 04-pods-wordpress.yamlapiVersion: v1kind: Podmetadata:name: wordpressspec:hostNetwork: truecontainers: - name: dbimage: harbor.koten.com/koten-db/mysql:5.7# 向容器传递环境变量env:# 变量的名称- name: MYSQL_ALLOW_EMPTY_PASSWORD# 指定变量的值value: "yes"- name: MYSQL_DATABASEvalue: "wordpress"- name: MYSQL_USERvalue: "admin"- name: MYSQL_PASSWORDvalue: "123"- name: wordpressimage: harbor.koten.com/koten-web/wordpress:v1.0env:- name: WORDPRESS_DB_HOST# 指定变量的值value: "127.0.0.1"- name: WORDPRESS_DB_NAMEvalue: "wordpress"- name: WORDPRESS_DB_USERvalue: "admin"- name: WORDPRESS_DB_PASSWORDvalue: "123"
10、运行资源清单
之前READY是1,现在变成2了
[root@Master231 pod]# kubectl apply -f 04-pods-wordpress.yaml pod/wordpress created[root@Master231 pod]# kubectl get pods NAMEREADY STATUSRESTARTS AGEwordpress 2/2 Running 05s
11、浏览器访问,部署wordpress业务
这篇文章真是太难了,都剩两个实战项目就写完了,我改了张图片,内容突然回滚到只剩下5000字了,我真是服了!!!
koten-docker-install.zip下载链接:链接:https://pan.baidu.com/s/11HEyYKI3KKcl4BA-w6VOMQ?pwd=ufmi
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!