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#53​Name:   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

遗留问题:重启后数据库信息将消失

解决方案:持久化保存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…

解决fatal: unable to access ‘https://........git/‘: Recv failure: Operation time

目录 前言 解决方法一 解决方法二 解决方法三 解决方法四 总结 前言 在使用 Git 进行代码拉取时&#xff0c;可能会遇到连接超时的问题&#xff0c;特别是在某些网络环境下&#xff0c;例如公司网络或防火墙严格的环境中。这种情况下&#xff0c;Git 无法访问远程仓…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

LLM - 使用 RAG (检索增强生成) 多路召回 实现 精准知识问答 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142629289 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 RAG (R…

windows下 Winobj.exe工具使用说明c++

1、winobj.exe工具下载地址 WinObj - Sysinternals | Microsoft Learn 2、接下来用winobj.exe查看全局互斥&#xff0c;先写一个小例子 #include <iostream> #include <stdlib.h> #include <tchar.h> #include <string> #include <windows.h>…

VS2017安装Installer Projects制作Setup包

下载安装扩展包 VS2017默认未安装Installer Projects Package&#xff0c;需要联机下载&#xff1a; 也可网页上下载离线InstallerProjects.vsix文件&#xff1a; https://visualstudioclient.gallerycdn.vsassets.io/extensions/visualstudioclient/microsoftvisualstudio20…

FPGA IP 和 开源 HDL 一般去哪找?

在FPGA开发的世界中&#xff0c;IP核和HDL模块是构建复杂数字系统的基石。它们如同乐高积木&#xff0c;让开发者能够快速搭建和重用经过验证的电路功能。但你是否曾感到迷茫&#xff0c;不知道从哪里寻找这些宝贵的资源&#xff1f;本文将为你揭开寻找FPGA IP核和HDL模块资源的…

Tesla T4 P2P测试

Tesla T4 P2P测试 一.测试环境二.测试步骤1.获取设备信息2.查看PCIE拓扑结构3.选择9B、9E这二张4.查看逻辑设备ID5.设置环境变量(需要用逻辑设备ID,通过UUID跟smi看到的物理ID关联)6.不同地址的原子操作2.P2P与非P2P的性能差异3.GPU带宽测试 Tesla T4 P2P测试 通过物理ID找到逻…

2024PT展,现场精华

9月25-27日&#xff0c;2024年国际信息通信展&#xff08;简称PT展&#xff09;在北京国家会议中心召开。 小枣君去了现场&#xff0c;也拍了一些照片&#xff0c;特此分享给大家。 会场离“奥林匹克公园”地铁站很近&#xff1a; Logo设计得还是挺好看的&#xff1a; 熟悉的场…

一区黏菌算法+双向深度学习+注意力机制!SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

一区黏菌算法双向深度学习注意力机制&#xff01;SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 一区黏菌算法双向深度学习注意力机制&#xff01;SMA-BiTCN-BiGRU-Attention黏菌算法优化双向时间卷积双向门控循环单元…

探索机器人快换盘技术的未来之路:智能化与协作的革新

在当今快速发展的科技时代&#xff0c;机器人已成为众多领域不可或缺的得力助手。其中&#xff0c;机器人快换盘技术作为提升机器人灵活性和应用广度的重要技术&#xff0c;正经历着前所未有的变革与创新。下面请随我们一起深入探讨这一技术的未来发展趋势。 一、人工智能&…

<<迷雾>> 第 4 章 电子计算机发明的前夜 示例电路

莫尔斯电报示意图 info::操作说明 鼠标单击开关切换开合状态 通电后, 线圈产生磁力从而将铁片开关(衔铁臂)吸引下来 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch04-01-morse-te…

Shopline对接需要注意的问题

Shopline对接是一项复杂而细致的工作&#xff0c;为了确保对接的顺利进行&#xff0c;并保证系统的稳定性和可靠性&#xff0c;需要注意以下几个方面。 1.API文档的详细阅读 功能理解&#xff1a; 仔细阅读Shopline提供的API文档&#xff0c;全面了解每个接口的功能、参数、返…

初始docker以及docker的基本使用!!!

文章目录 虚拟化技术Docker/podman 命令通用命令查看docker 当前版本管理docker运行 镜像操作[image]列出本地所有镜像拉取镜像删除镜像把docker中的镜像打包成文件把镜像文件加载到docker中上传镜像 容器操作[container]创建容器docker run的参数选项列出所有容器启动容器停止…

安防区域保护:无线电干扰设备技术详解

在安防区域保护中&#xff0c;无线电干扰设备技术扮演着重要角色&#xff0c;它主要用于通过发射特定频率的无线电波来干扰无人机或其他无线电设备的通信链路、导航信号或控制信号&#xff0c;以达到削弱、阻断甚至控制这些设备运行的目的。以下是对无线电干扰设备技术的详细解…

【GAN】生成对抗网络Generative Adversarial Networks理解摘要

【Pytorch】生成对抗网络实战_pytorch生成对抗网络-CSDN博客 【损失函数】KL散度与交叉熵理解-CSDN博客 [1406.2661] Generative Adversarial Networks (arxiv.org) GAN本质是对抗或者说竞争&#xff0c;通过生成器和鉴别器的竞争获取有效地结果&#xff0c;换句话说&#xff0…

每日一练 2024.9.29(2)

目录 解题思路与代码实现 题目分析 一、解题策略 关键步骤&#xff1a; 二、代码实现 三、代码解析 四、复杂度分析 五、运行示例 示例1&#xff1a; 示例2&#xff1a; 六、总结 解题思路与代码实现 题目分析 这道题目要求我们找到字符串列表 strs 中的相似字符组…

C++——vector

1.简介 2.成员函数 2.1构造函数 void test_vector1() {//1.无参构造vector<int> v1;cout << v1.capacity() << endl;//2.传参构造vector<int> v2(10,1);//3.迭代器构造vector<int> v3(v2.begin(), v2.end());//也可以使用其它容器的迭代器区间来…

scrapy快速上手

安装 除了scrapy本身还要安装两个库 pip install scrapy pip install pywin32 pip install wheel 创建项目 在要创建项目的地方打开powershell scrapy startproject 项目名 我们得到这样的项目结构&#xff0c;功能如下 scrapy.cfg 项目的主配置信息 …

LeetCode[中等] 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 思路 回溯法 log&#xff1a;当前结果数组&#xff1b;level&#xff1a…