K8S服务发布
一 、服务发布方式对比
二者主要区别在于:
1、部署复杂性:传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等,过程相对复 杂且容易出错。相比之下,Kubernetes服务发布方式 通过使用容器编排和自动化部署工具,简化了部署过程,使得服务的创建、部署和管理更加容易和高效。
2、弹性伸缩:Kubernetes 具有自动弹性伸缩功能,可 以根据实际需求自动增加或减少容器数量,以保持服 务的稳定性和性能。传统服务发布方式通常需要手动 调整服务器规模,难以实现快速弹性伸缩。
3、容错性:Kubernetes 具有内置的容错机制,当某个 容器出现故障时,Kubernetes 会自动将其从集群中 移除,并重新启动一个新的容器。这有助于保持服务 的可用性和稳定性。传统服务发布方式可能无法很好 地处理此类故障,导致服务中断。
4、资源利用率:Kubernetes 通过容器化技术,可以实 现资源的共享和动态分配,提高了资源的利用率。传 统服务发布方式可能会因服务器资源的浪费而降低资 源利用率。
5、可维护性:Kubernetes 提供了强大的可维护性功 能,例如服务发现、配置管理和版本控制等。这些功 能有助于简化服务的维护和升级过程。传统服务发布 方式可能需要更多的手动维护工作,且升级过程可能 更加复杂。
6、成本:虽然 Kubernetes 需要一定的学习曲线和初始 配置成本,但从长远来看,其自动化部署、弹性伸缩 和资源优化等功能可以帮助企业节省大量的运维成 本。传统服务发布方式可能需要更多的运维人力和资 源投入。
二、Label 和 Selector
Label:标签,可以对 K8S 的些对象,如 Pod 和节点 进行分组,通过添加 key=value 格式的标签,用于区 分同样的资源不同的分组。
Selector:标签选择器,可以根据资源标签查询出精 确的对象信息。
1、自定义 Label
为某个节点添加标签 Label
[root@k8s-master wp]# kubectl label nodes k8s-node01 abc=1node/k8s-node01 labeled[root@k8s-master wp]# kubectl get node -l abc=1NAME STATUS ROLES AGE VERSIONk8s-node01 Ready <none> 11d v1.28.2
在 deployment 或其他控制器中指定将 Pod 部署到该 节点
(创建nginx deployment 让他只能部署在node01上)
[root@k8s-master wp]# vim nginx-deploy.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:nodeSelector:abc: "1"containers:- name: nginximage: docker.io/library/nginx:latestimagePullPolicy: Neverports:- name: nginxportcontainerPort: 80[root@k8s-master wp]# kubectl create -f nginx-deploy.yaml deployment.apps/nginx created[root@k8s-master wp]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-test-66bb44bd88-zdfdf 1/1 Running 4 (45m ago) 10d 172.16.85.214 k8s-node01 <none> <none>mariadb-deployment-55bc54f6f5-kbbzm 1/1 Running 0 107m 172.16.58.215 k8s-node02 <none> <none>nginx-6bb6dc9958-5b965 1/1 Running 0 55s 172.16.85.219 k8s-node01 <none> <none>nginx-6bb6dc9958-hx4wg 1/1 Running 0 55s 172.16.85.218 k8s-node01 <none> <none>nginx-6bb6dc9958-wlhj9 1/1 Running 0 55s 172.16.85.220 k8s-node01 <none> <none># pod已添加到node01节点上
2、污点信息
# 查看master的污点信息,该master为禁调度节点[root@k8s-master wp]# kubectl describe nodes k8s-master | grep TaintsTaints: node-role.kubernetes.io/control-plane:NoSchedule# 可通过该命令去除master节点的禁调度污点,但正常情况下不允许这么做,因为master节点是管理node节点的,不需要进行负载[root@k8s-master wp]# kubectl taint node k8s-master node-role.kubernetes.io/control-planeerror: at least one taint update is required[root@k8s-master wp]# kubectl taint node k8s-master node-role.kubernetes.io/control-plane:NoScheduleerror: node k8s-master already has node-role.kubernetes.io/control-plane taint(s) with same effect(s) and --overwrite is false
3、为各节点设置 Label
# 为master节点设置master角色标签[root@k8s-master wp]# kubectl label nodes k8s-master role=masternode/k8s-master labeled# 为node节点设置node角色标签[root@k8s-master wp]# kubectl label nodes k8s-node01 k8s-node02 role=nodenode/k8s-node01 labelednode/k8s-node02 labeled
4、Selector 选择器
# 查看所有节点的标签[root@k8s-master wp]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELSk8s-master Ready control-plane 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,role=masterk8s-node01 Ready <none> 11d v1.28.2 abc=11,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,role=nodek8s-node02 Ready <none> 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,role=node# 匹配标签,匹配规则:role这个key的value在master和node之间[root@k8s-master wp]# kubectl get nodes -l 'role in (master, node)'NAME STATUS ROLES AGE VERSIONk8s-master Ready control-plane 11d v1.28.2k8s-node01 Ready <none> 11d v1.28.2k8s-node02 Ready <none> 11d v1.28.2# 选择匹配role为master或node且不包括abc=1的node[root@k8s-master wp]# kubectl get nodes -l abc!=1,'role in (master, node)'NAME STATUS ROLES AGE VERSIONk8s-master Ready control-plane 11d v1.28.2k8s-node02 Ready <none> 11d v1.28.2# 匹配标签的key为abc的node[root@k8s-master wp]# kubectl get nodes -l abcNAME STATUS ROLES AGE VERSIONk8s-node01 Ready <none> 11d v1.28.2
5、修改标签
将 abc=1 这个标签改为 abc=11,直接指定 key ,然后使用 --overwrite 参数重写标签
[root@k8s-master wp]# kubectl label nodes k8s-node01 abc=11error: 'abc' already has a value (1), and --overwrite is false[root@k8s-master wp]# kubectl label nodes k8s-node01 abc=11 --overwrite node/k8s-node01 labeled[root@k8s-master wp]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELSk8s-master Ready control-plane 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=k8s-node01 Ready <none> 11d v1.28.2 abc=11,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linuxk8s-node02 Ready <none> 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux[root@k8s-master wp]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-test-66bb44bd88-zdfdf 1/1 Running 6 (29m ago) 10d 172.16.85.214 k8s-node01 <none> <none>mariadb-deployment-55bc54f6f5-kbbzm 1/1 Running 0 3h30m 172.16.58.215 k8s-node02 <none> <none>nginx-6bb6dc9958-5b965 1/1 Running 0 104m 172.16.85.219 k8s-node01 <none> <none>nginx-6bb6dc9958-hx4wg 1/1 Running 0 104m 172.16.85.218 k8s-node01 <none> <none>nginx-6bb6dc9958-wlhj9 1/1 Running 0 104m 172.16.85.220 k8s-node01 <none> <none>[root@k8s-master wp]# kubectl delete -f nginx-deploy.yamldeployment.apps "nginx" deleted[root@k8s-master wp]# kubectl create -f nginx-deploy.yamldeployment.apps/nginx created# 找不到标签为abc=1的node节点就会自动挂起[root@k8s-master wp]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-test-66bb44bd88-zdfdf 1/1 Running 6 (30m ago) 10d 172.16.85.214 k8s-node01 <none> <none>mariadb-deployment-55bc54f6f5-kbbzm 1/1 Running 0 3h31m 172.16.58.215 k8s-node02 <none> <none>nginx-6bb6dc9958-l4mrm 0/1 Pending 0 2s <none> <none> <none> <none>nginx-6bb6dc9958-mw29p 0/1 Pending 0 2s <none> <none> <none> <none>nginx-6bb6dc9958-v8flb 0/1 Pending 0 2s <none> <none> <none> <none>
6、删除标签
删除 node01 的 abc=11 的标签
[root@k8s-master wp]# kubectl label nodes k8s-node01 role-node/k8s-node01 unlabeled[root@k8s-master wp]# kubectl get node --show-labels | grep k8s-node01k8s-node01 Ready <none> 11d v1.28.2 abc=11,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux[root@k8s-master wp]# kubectl label nodes k8s-node01 abc-node/k8s-node01 unlabeled[root@k8s-master wp]# kubectl get node --show-labels | grep k8s-node01k8s-node01 Ready <none> 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux
批量删除标签
# 先为多个节点设定标签[root@k8s-master wp]# kubectl label nodes k8s-master k8s-node01 k8s-node02 type=hahanode/k8s-master labelednode/k8s-node01 labelednode/k8s-node02 labeled# 直接让所有node节点删除以type为key的标签[root@k8s-master wp]# kubectl label nodes -l type type-node/k8s-master unlabelednode/k8s-node01 unlabelednode/k8s-node02 unlabeled# 为多个节点设定标签[root@k8s-master wp]# kubectl label nodes k8s-master k8s-node01 k8s-node02 type=hahanode/k8s-master labelednode/k8s-node01 labelednode/k8s-node02 labeled# 可以使用for循环删除多个但并非全部节点的标签[root@k8s-master wp]# for i in 01 02;do kubectl label nodes k8s-node$i type-;donenode/k8s-node01 unlabelednode/k8s-node02 unlabeled[root@k8s-master wp]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELSk8s-master Ready control-plane 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,role=master,type=hahak8s-node01 Ready <none> 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linuxk8s-node02 Ready <none> 11d v1.28.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux
三、Service
1、K8S 的 Service
Kubernetes(k8s)中的 Service 是一种抽象概念,它定 义了一种可以访问 Pod 逻辑分组的策略。它通常通过 Label Selector 访问 Pod 组,解决了 Pod 的 IP 地址可 能发生变化的问题。
2、定义 Service
需要注意的是,Service 能够将一个接收端口映射到任意 的 targetPort,但如果 targetPort 为空,targetPort 将 被设置为与 Port 字段相同的值。targetPort 可以设置为 一个字符串,可引用 backend Pod 的一个端口的名称, 这样的话即使更改了 Pod 的端口,也不会对 Service 的 访问造成影响。
Kubernetes Service 能够支持 TCP、UDP、STCP 等协 议,默认为 TCP 协议。
# 访问server001:80 即可访问到具有 app=server001 标签的 Pod 的80 端口上。[root@k8s-master wp]# vim server001.yamlapiVersion: v1kind: Servicemetadata:name: server001spec:selector:app: server001 # 要匹配的pod标签ports:- port: 80 # service的端口 protocol: TCP # 协议targetPort: 80 # 目标容器的端口type: ClusterIP[root@k8s-master wp]# kubectl create -f server001.yaml service/server001 created[root@k8s-master wp]# kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11dserver001 ClusterIP 10.96.96.142 <none> 80/TCP 13s[root@k8s-master wp]# curl 10.96.96.142:80curl: (7) Failed connect to 10.96.96.142:80; 拒绝连接
3、创建 Service
1)使用service代理pod
[root@k8s-master wp]# kubectl run serverpodtest --image docker.io/library/nginx:alpine --image-pull-policy Neverpod/serverpodtest created[root@k8s-master wp]# kubectl label pod serverpodtest app=server001pod/serverpodtest labeled[root@k8s-master wp]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELScluster-test-66bb44bd88-zdfdf 1/1 Running 6 (43m ago) 10d app=cluster-test,pod-template-hash=66bb44bd88mariadb-deployment-55bc54f6f5-kbbzm 1/1 Running 0 3h45m app=mariadb,pod-template-hash=55bc54f6f5serverpodtest 1/1 Running 0 114s app=server001,run=serverpodtest[root@k8s-master wp]# curl 10.96.96.142:80<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>
2)使用service代理deployment
(重新定义了一个service)
deployment
[root@k8s-master wp]# vim deployment001.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: test000deployment # deploy资源名称labels:app: test000deployment # 标签run: abcspec:replicas: 4selector:matchLabels:app: nginxtest # 配置pod标签template:metadata:labels:app: nginxtestspec:containers:- name: nginximage: docker.io/library/nginx:alpineimagePullPolicy: Neverports:- name: nginxportcontainerPort: 80
service
[root@k8s-master wp]# vim service001.yamlapiVersion: v1kind: Servicemetadata:name: nginxtestspec:selector:app: nginxtestports:- port: 80targetPort: 80protocol: TCPtype: ClusterIP
代理测试
[root@k8s-master wp]# kubectl create -f deployment001.yaml[root@k8s-master wp]# kubectl create -f service001.yaml [root@k8s-master wp]# kubectl get poNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-zdfdf 1/1 Running 7 (57m ago) 10dmariadb-deployment-55bc54f6f5-kbbzm 1/1 Running 0 4h58mtest000deployment-5496fcbccd-4t87g 1/1 Running 0 9m5stest000deployment-5496fcbccd-bng7r 1/1 Running 0 9m5stest000deployment-5496fcbccd-gmpxm 1/1 Running 0 9m5stest000deployment-5496fcbccd-h2kms 1/1 Running 0 9m5s[root@k8s-master wp]# kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11dnginxtest ClusterIP 10.96.99.183 <none> 80/TCP 2m37s# curl通说明service和pod连接成功# 此时,如果删除了pod,根据deployment特性会再次建立pod,而这时pod的IP地址会发生变化# 但根据k8s的service特性,不论后面的pod的IP如何变化,只要绑定了对应pod的标签,就可以访问到pod[root@k8s-master wp]# curl 10.96.99.183<!DOCTYPE html><html><head><title>Welcome to nginx!</title>
4、Service 类型
K8S Service Type(服务类型)主要包括:
ClusterIP:在集群内部使用,默认值,只能从集群中 访问。
NodePort:在所有安装了 Kube-Proxy 的节点上打 开一个端口,此端口可以代理至后端Pod,可以通过 NodePort 从集群外部访问集群内的服务,格式为 NodelP:NodePort。
LoadBalancer:使用云提供商的负载均衡器公开服 务,成本较高。
ExternalName:通过返回定义的 CNAME 别名,没 有设置任何类型的代理,需要1.7 或更高版本kubedns 支持。
5、NodePort 类型
如果将 Service 的 Type 字段设置为 NodePort,则 K8S 将从指定范围(默认 30000-32767)内自动分配端口,也 可手动指定 NodePort,创建该 Service 后,集群中的每 个节点都将暴露一个端口,通过某个宿主机的 IP+端口即 可访问到后端应用。
定义格式如下:
[root@k8s-master wp]# vim service001.yaml apiVersion: v1kind: Servicemetadata:name: nginxtestspec:selector:app: nginxtestports:- port: 80targetPort: 80protocol: TCPtype: NodePort
重新加载 yaml
[root@k8s-master wp]# kubectl delete -f service001.yaml service "nginxtest" deleted[root@k8s-master wp]# kubectl create -f service001.yaml service/nginxtest created# 服务的80端口映射到了宿主机的30462端口[root@k8s-master wp]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11dnginxtest NodePort 10.96.70.126 <none> 80:30462/TCP 6s
宿主机访问测试:http://10.0.0.66:30462
修改随机端口为指定端口(范围:30000-32767)
[root@k8s-master wp]# kubectl edit svc nginxtest error: services "nginxtest" is invalidservice/nginxtest edited
再次访问测试:
三个节点都是可以访问的
6、使用 Service 代理 K8S 外部 服务
使用场景:
希望在生产环境中使用某个固定的名称而非 IP 地址访 问外部的中间件服务;
希望 Service 指向另一个 Namespace 中或其他集群 中的服务;
正在将工作负载转移到 Kubernetes 集群,但是一部 分服务仍运行在 Kubernetes 集群之外的 backend。
外部Service 配置:
[root@k8s-master wp]# vim test001ext.yamlapiVersion: v1kind: Servicemetadata:name: test001servicespec:selector:app: extports:- port: 80targetPort: 80protocol: TCPtype: ClusterIP # 修改类型为ClusterIP,只需要k8s集群访问---apiVersion: v1kind: Endpointsmetadata:name: extlabels:app: extsubsets:- addresses:- ip: 10.0.0.99 # 更改为另一台主机的IP,这台主机要安装nginx,方便测试ports:- name: nginxport: 80protocol: TCP[root@k8s-master wp]# kubectl create -f test001ext.yaml service/test001service createdendpoints/ext created
四、实战:Ingress 搭建 Nginx+WP 论坛 +MariaDB
1、网站架构
本次部署形式完全舍弃 Docker,将所有应用都置于 Kubernetes,采用 Deployment 而非单 Pod 部署,稳 定性得到升级。、
在上次实战环节,Nginx 作为反向代理服务器,在本次 实战中,Nginx 便作为 Ingress Controller。Wordpress 扩容到两个,提高可用性。而 MariaDB 因为要保证数据 一致性,所以只用一个实例。
2、部署 MariaDB
1)定义 ConfigMap
# configmap[root@k8s-master aa]# vim mariadb-configmap.yamlapiVersion: v1kind: ConfigMapmetadata:name: mariadb-configmapdata:USER: "wp"PASSWORD: "123"ROOT_PASSWORD: "123"DATABASE: "db"
2)定义 Deployment
# deployment[root@k8s-master aa]# vim mariadb-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: mariadb-deploymentlabels:app: mariadb-deploymentspec:replicas: 1selector:matchLabels:app: mariadb-deploymenttemplate:metadata:labels:app: mariadb-deploymentspec:containers:- name: mariadbimage: docker.io/library/mariadb:latestimagePullPolicy: Neverports:- name: mariadbportcontainerPort: 3306envFrom:- prefix: "MARIADB_"configMapRef:name: mariadb-configmap
3)定义 Service
# service[root@k8s-master aa]# vim mariadb-service.yamlapiVersion: v1kind: Servicemetadata:name: mariadb-servicespec:selector:app: mariadb-deployment # 指定mariaDB的deployment标签ports:- port: 3306targetPort: 3306protocol: TCPtype: NodePort
4)启动 MariaDB
[root@k8s-master aa]# kubectl create -f mariadb-configmap.yaml configmap/mariadb-configmap created[root@k8s-master aa]# kubectl get cmNAME DATA AGEkube-root-ca.crt 1 11dmariadb-configmap 4 13m[root@k8s-master aa]# kubectl create -f mariadb-deployment.yaml deployment.apps/mariadb-deployment created[root@k8s-master aa]# kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScluster-test-66bb44bd88-zdfdf 1/1 Running 9 (48m ago) 11d 172.16.85.214 k8s-node01 <none> <none>mariadb-deployment-5bf6d9f98c-lxlhm 1/1 Running 0 4m47s 172.16.58.221 k8s-node02 <none> <none>[root@k8s-master aa]# mysql -h172.16.58.221 -p123MariaDB [(none)]> [root@k8s-master aa]# kubectl create -f mariadb-service.yaml service/mariadb-service created[root@k8s-master aa]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11dmariadb-service NodePort 10.96.247.148 <none> 3306:30318/TCP 24s
使用测试工具进行测试(访问解析域名)
[root@k8s-master aa]# kubectl get podNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-zdfdf 1/1 Running 10 (105s ago) 11d[root@k8s-master aa]# kubectl exec -it pods/cluster-test-66bb44bd88-zdfdf -- bash(08:44 cluster-test-66bb44bd88-zdfdf:/) nslookup mariadb-serviceServer: 10.96.0.10Address: 10.96.0.10#53Name: mariadb-service.default.svc.cluster.localAddress: 10.96.247.148
3、部署 Wrodpress
1)定义 ConfigMap
[root@k8s-master aa]# vim wordpress-configmap.yamlapiVersion: v1kind: ConfigMapmetadata:name: wordpress-configmapdata:NAME: "db"USER: "wp"PASSWORD: "123"HOST: "mariadb-service" # 将此处写为mariadb的service名称,不用再写IP
2)定义Deployment
[root@k8s-master aa]# vim wordpress-deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:name: wordpress-deploymentlabels:app: wordpress-deploymentspec:replicas: 2selector:matchLabels:app: wordpress-deploymenttemplate:metadata:labels:app: wordpress-deploymentspec:containers:- name: wpimage: docker.io/library/wordpress:latestimagePullPolicy: Neverports:- name: wordpressprotcontainerPort: 80envFrom:- prefix: "WORDPRESS_DB_"configMapRef:name: wordpress-configmap
3)定义 Service
[root@k8s-master aa]# vim wordpress-service.yamlapiVersion: v1kind: Servicemetadata:name: wordpress-servicespec:selector:app: wordpress-deploymentports:- name: httpport: 80targetPort: 80nodePort: 32000protocol: TCPtype: NodePort
4)启动 WordPress
[root@k8s-master aa]# kubectl create -f wordpress-configmap.yaml configmap/wordpress-configmap created[root@k8s-master aa]# kubectl get cmNAME DATA AGEkube-root-ca.crt 1 11dmariadb-configmap 4 84mwordpress-configmap 4 1s[root@k8s-master aa]# kubectl create -f wordpress-deployment.yaml deployment.apps/wordpress-deployment created[root@k8s-master aa]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGEcluster-test 1/1 1 1 11dmariadb-deployment 1/1 1 1 74mwordpress-deployment 2/2 2 2 2s[root@k8s-master aa]# kubectl create -f wordpress-service.yaml service/wordpress-service created[root@k8s-master aa]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12dmariadb-service NodePort 10.96.247.148 <none> 3306:30318/TCP 62mwordpress-service NodePort 10.96.67.149 <none> 80:32000/TCP 2s
现在就可以做访问网站测试了,此时是没有 Ingress 的
4、访问测试
访问 10.0.0.66:32000
五、Ingress
1、Ingress 概念
Ingress 是 Kubernetes 中的一种资源对象,用于将外部 流量路由到集群内部的服务。它充当了一个入口 (gateway) 的角色,可以根据不同的规则将流量导向到不 同的服务,从而实现负载均衡和路由管理。
使用 ingress 可以将多个服务公开给外部网络,并进行 灵活的流量控制。通常与 ingress controller(如 nginx ingress controller、HAProxy 等)一起使用,ingress controller 负责实际的流量管理和请求转发操作。
Service 是由 kube-proxy 控制的四层负载均衡(端口+ IP),而 Ingress 是七层负载均衡的 API 对象(主机名、 URI、请求头、证书等)。
2、Ingress Controller
Service 本身是没有服务能力的,它只是一些 iptables 规 则,真正配置、应用这些规则的实际上是节点里的 kube-proxy 组件。如果没有 kube-proxy,Service 定义 得再完善也没有用。
Ingress 也只是一些 HTTP 路由规则的集合,相当于一份 静态的描述文件,真正要把这些规则在集群里实施运 行,还需要有另外一个东西,这就是 Ingress Controller,它的作用就相当于 Service 的 kubeproxy,能够读取、应用 Ingress 规则,处理、调度流 量。
Nginx 是代理服务器中稳定性最好、性能最高的产品, 所以它可以被誉为 Kubernetes 里应用最为广泛的 Ingress Controller。
3、Ingress Class
随着 Ingress 在实践中的大量应用,很多用户发现 Ingress+Ingress Controller 这种用法会带来一些问题, 比如:
由于某些原因,项目组需要引入不同的 Ingress Controller,但 Kubernetes 不允许这样做。
Ingress 规则太多,都交给一个 Ingress Controller 处 理会让它不堪重负。
多个 Ingress 对象没有很好的逻辑分组方式,管理和 维护成本很高。
集群里有不同的租户,他们对 Ingress 的需求差异很 大甚至有冲突,无法部署在同一个 Ingress Controller 上。
而 K8S 提出了一个 Ingress Class 的概念,让它插在 Ingress 和 Ingress Controller 中间,作为流量规则和控 制器的协调人,解除了 Ingress 和 Ingress Controller 的 强绑定关系。
Kubernetes 用户可以转向管理 Ingress Class,用它来 定义不同的业务逻辑分组,简化 Ingress 规则的复杂 度。
比如说,我们可以用 Class A 处理博客流量、Class B 处 理短视频流量、Class C 处理购物流量。
4、部署 Nginx Ingress Controller
1)安装 Ingress Controller
[root@k8s-master aa]# kubectl create -f ingress.yaml [root@k8s-master aa]# kubectl get pod -n ingress-nginx NAME READY STATUS RESTARTS AGEingress-nginx-admission-create-mp7xv 0/1 Completed 0 21mingress-nginx-admission-patch-922p4 0/1 Completed 0 21mingress-nginx-controller-674f66cf96-6wljn 1/1 Running 0 21m[root@k8s-master aa]# kubectl describe pod -n ingress-nginx ingress-nginx-controller-674f66cf96-6wljnEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 25m default-scheduler Successfully assigned ingress-nginx/ingress-nginx-controller-674f66cf96-6wljn to k8s-node01Warning FailedMount 23m (x8 over 25m) kubelet MountVolume.SetUp failed for volume "webhook-cert" : secret "ingress-nginx-admission" not foundNormal Pulling 22m kubelet Pulling image "registry.cn-beijing.aliyuncs.com/dotbalo/ingress-nginx-controller:v1.7.1"Normal Pulled 20m kubelet Successfully pulled image "registry.cn-beijing.aliyuncs.com/dotbalo/ingress-nginx-controller:v1.7.1" in 2m27.43s (2m27.43s including waiting)Normal Created 20m kubelet Created container controllerNormal Started 20m kubelet Started container controllerNormal RELOAD 20m nginx-ingress-controller NGINX reload triggered due to a change in configuration[root@k8s-master aa]# kubectl get svc -A | grep ingress-nginxNAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx ingress-nginx-controller NodePort 10.96.144.127 <none> 80:30886/TCP,443:31360/TCP 27mingress-nginx ingress-nginx-controller-admission ClusterIP 10.96.126.23 <none> 443/TCP 27m# 记住ingress-nginx-controller的端口映射80=>30886
2)部署 Ingress
[root@k8s-master aa]# vim ingress-001.yaml apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: wp-ingress # Ingress名称namespace: defaultspec:ingressClassName: nginx # Controller类型rules: # 路由规则- host: wp-web.com # 域名http:paths:- path: /pathType: ImplementationSpecific # 路径匹配⽅式backend:service:name: wordpress-service # service名称,这里要匹配到wordpress的serviceport:number: 80 # service的端⼝号[root@k8s-master aa]# kubectl create -f ingress-001.yaml ingress.networking.k8s.io/wp-ingress created[root@k8s-master ~]# kubectl get ingressNAME CLASS HOSTS ADDRESS PORTS AGEwp-ingress nginx wp-web.com 10.0.0.77 80 9h[root@k8s-master aa]# kubectl get podNAME READY STATUS RESTARTS AGEcluster-test-66bb44bd88-zdfdf 1/1 Running 15 (37m ago) 11dmariadb-deployment-5bf6d9f98c-lxlhm 1/1 Running 1 (97m ago) 18hwordpress-deployment-d6cd85444-74848 1/1 Running 1 (97m ago) 16hwordpress-deployment-d6cd85444-hnxxh 1/1 Running 1 (97m ago) 16h[root@k8s-master aa]# kubectl exec -it cluster-test-66bb44bd88-zdfdf -- bash(02:39 cluster-test-66bb44bd88-zdfdf:/) nslookup wordpress-serviceServer: 10.96.0.10Address: 10.96.0.10#53Name: wordpress-service.default.svc.cluster.localAddress: 10.96.67.149[root@k8s-master ~]# kubectl get pod -n ingress-nginxNAME READY STATUS RESTARTS AGEingress-nginx-admission-create-mp7xv 0/1 Completed 0 9hingress-nginx-admission-patch-922p4 0/1 Completed 0 9hingress-nginx-controller-674f66cf96-6wljn 1/1 Running 1 (8h ago) 9h# 修改本机的域名解析
[root@k8s-master aa]# kubectl get service -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-nginx-controller NodePort 10.96.144.127 <none> 80:30886/TCP,443:31360/TCP 57mingress-nginx-controller-admission ClusterIP 10.96.126.23 <none> 443/TCP 57m
遗留问题:重启后数据库信息将消失
解决方案:持久化保存
相关文章:

K8S服务发布
一 、服务发布方式对比 二者主要区别在于: 1、部署复杂性:传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等,过程相对复 杂且容易出错。相比之下,Kubernetes服务发布方式 通过使用容器编排和自动化部署工…...

Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

Html CSS 布局,位置处理 居中 对齐
Html CSS 布局,位置处理 1、居中布局 1、div 让内部div居中对齐 html <div class"container"><div class"item">I am centered!</div> </div>style .container {border: 2px solid rgb(75, 70, 74);border-radius:…...

Spring MVC系统学习(二)——Spring MVC的核心类和注解
Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建基于Web的应用程序。它使用模型、视图和控制器分离的设计模式,使得Web开发更加模块化和灵活。在学习Spring MVC时,有几个核心类和注解是非常关键的&…...

conda虚拟环境安装包、依赖同一管理
在 Python 的虚拟环境中,每个环境都是独立的,这意味着即使两个环境需要相同的库,它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响,确保每个项目都有一个干净且隔离的环境。 方法一:使用 Conda 的共…...

Unity网络开发记录(四):在unity中进一步封装客户端类
在上一篇文章中,简单的封装了一下服务端中相关的socket对象,为了可以更方便的使用。所以在本篇中,进一步封装一下在unity中的相关客户端类 封装客户端类,首先采用单例模式,然后采用两个队列来存储我们相关的收发信息 p…...

Linux内核中的UART驱动-详解Linux内核UART驱动:结构与功能分析
一、UART概述 UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发器,是一种串行通信接口,用于在计算机和外部设备之间传输数据。它特别适用于短距离、低速、串行和全双工的数据传输。在Linux内核中&a…...

威胁检测与防范:如何及时、准确对抗安全风险
随着技术的飞速发展,网络空间中的威胁日益多样化、隐蔽化,给个人、企业乃至国家的信息安全带来诸多挑战。面对严峻的网络威胁,传统的防火墙、入侵检测系统(IDS)等防御手段虽能在一定程度上抵御外部攻击,但依…...

数据结构串的kmp相关(求next和nextval)
傻瓜版,用来演示手算过程,个人理解用的,仅供参考。...

创建游戏暂停菜单
创建用户控件 设置样式 , 加一层 背景模糊 提升UI菜单界面质感 , 按钮用 灰色调 编写菜单逻辑 转到第三人称蓝图 推荐用 Set Input Mode Game And UI , 只用仅UI的话 增强输入响应不了 让游戏暂停的话也可以用 Set Game Paused , 打勾就是暂停 , 不打勾就是继续游戏 , 然后…...

seata服务端部署
1.下载seata 官网下载地址:http://seata.io/zh-cn/blog/download.html 或者下载 作者已经下载的压缩包1.4.0 注意!!! 要参考对应的版本,否则可能出现无法正常启动的情况。 参考文档 下载完毕后解压压缩文件 2.修改配…...

理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想。 1.概念介绍 首先看一下维基上对闭包的解释: 在计算机科学中,闭包…...

51单片机的教室智能照明系统【proteus仿真+程序+报告+原理图+演示视频】
1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块DS1302时钟模块光照传感器红外传感器温度传感器LED等模块构成。适用于教室灯光全自动控制、教室节能灯控制、教室智能照明等相似项目。 可实现功能: 1、LCD1602实时显示时间、温度、光照强度等信息 2、光照强度传…...

一款资产进行快速存活验证工具
01工具介绍 (下载地址见最后) 在日常工作的渗透测试过程中,经常会碰到渗透测试项目,而Web渗透测试通常是渗透项目的重点或者切入口。通常拿到正规项目授权后,会给你一个IP资产列表和对应的Web资产地址,这时…...

I/O中断处理过程
中断优先级包括响应优先级和处理优先级,响应优先级由硬件线路或查询程序的查询顺序决定,不可动态改变。处理优先级可利用中断屏蔽技术动态调整,以实现多重中断。下面来看他们如何运用在中断处理过程中: 中断控制器位于CPU和外设之…...

关于PHP 匿名函数在处理数据结构中的应用
PHP 的匿名函数(也称为闭包)在处理数据结构时非常有用。它们可以在需要一次性函数的情况下使用,例如数组函数的回调、事件处理或作为其他函数的参数。以下是一些常见的应用场景: 数组操作: 使用 array_map、array_fil…...

安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android13里面的鼠标貌似比以前版本的鼠标小了,有些客户想要把这个鼠标改大。这个功能,android有现成的,就在这里,设置 =》无障碍 =》色彩和动画 =》 大号鼠标指针。 我们通过…...

AI学习指南深度学习篇-批标准化在深度学习中的应用
AI学习指南深度学习篇-批标准化在深度学习中的应用 引言 批标准化(Batch Normalization, BN)是一种在深度学习中常用的技术,旨在加速训练过程并提高模型的稳定性。它通过标准化每一个小批量的激活值,减小内部协变量偏移…...

了解网络的相关信息
文章目录 前言了解网络的相关信息1. ip是什么?1.1. 公网IP:1.2. 私有IP:1.2.1. 示例 2. 子网掩码3. 子网掩码的划分网段是什么4. 特殊的回路IP网段(127.0.0.1)5. 端口 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊&#x…...

Java | Leetcode Java题解之第447题回旋镖的数量
题目: 题解: class Solution {public int numberOfBoomerangs(int[][] points) {int ans 0;for (int[] p : points) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int[] q : points) {int dis (p[0] - q[0]) * (p[…...

Docker实践与应用举例
引言 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。本文将详细介绍 Dock…...

828华为云征文 | 智能监控新篇章,Prometheus如何在华为云Flexusx容器环境中大展身手
前言 在数字化转型的浪潮中,智能监控成为企业IT战略的关键环节。部署在华为云Flexus X实例上的Prometheus监控系统,凭借其卓越的性能与灵活性,正开启智能监控的新篇章。Flexus X实例以其强大的计算能力和灵活的资源管理,为Prometh…...

基于单片机的可调式中文电子日历系统
** 文章目录 前言概要功能设计软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…...

《C++设计新思维-泛型编程与设计模式之应用》阅读记录
目录 写在前面policy和policy class的认识 写在前面 这本书是2003年出版的,大佬侯捷翻译的,21年前的书了,最近打算翻一翻。 看这种技术书籍,特别是简历理论体系的书籍,最好看纸质书。 本书从根本上展示了generic pa…...

vue访问组件的数据和方法
组件源码 <template><view class"c_container" :style"myStyle" click"clickCust"><view style"font-size: 18px;text-align: center;">{{item.name}}</view><view style"margin-top: 10px;font-siz…...

Redis: RDB与AOF的选择和容灾备份以及Redis数据持久化的优化方案
如何选择RDB和AOF 1 )同时开启 在我们 Redis 的服务器上,把RDB和AOF同时打开, 这样可以通过RDB快速的恢复数据,因为它是一个紧凑的缩缩的二进制文件, 但是有时 Redis 的不小心故障了,丢失了十几分钟的数据 可以通过AOF来做数据的…...

Goweb---Gorm操作数据库(二)
Gorm允许用户自己自定义钩子操作,使用这些钩子操作,可以在增删改查操作前进行相关的操作和检验,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。 自定义钩子函数 package ma…...

鸿蒙HarmonyOS之封装Http请求工具类
一、常量类 Constants.ets //超时时间10秒 static readonly HTTP_READ_TIMEOUT: number 10000;//请求成功返回码 static readonly HTTP_CODE_200: number 200;//请求成功后data中的code值(根据实际情况定) static readonly SERVER_CODE_SUCCESS: numb…...

java基础(4)类和对象
目录 1.前言 2.正文 2.1类的定义与使用 2.1.1类的定义 2.1.2类的实例化 2.1.3this引用 2.1.3.1 访问当前对象的成员变量 2.1.3.2调用当前对象的成员方法 2.1.3.3构造函数中的 this 2.1.3.4归纳this 2.2封装 2.2.1封装的定义 2.2.2访问修饰符 2.3static 2.3.1sta…...

[Linux]:线程(二)
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 与Windows环境不同,我们在linux环境下需要通过指令进行各操作&…...