文章目录

  • service管理
    • clusterIP
    • 服务类型
    • nodePort
    • Ingress
      • 安装Ingress控制器
      • 创建后端服务
      • 对外发布服务

service管理

  • 容器化带来的问题

    • 自动调度:在Pod创建之前,用户无法预知Pod所在的节点,以及Pod的IP地址
    • 一个已经存在的Pod在运行过程中,如果出现故障,Pod也会在新的节点使用新的IP进行部署
    • 应用程序访问服务的时候,地址也不能经常变换
    • 多个相同的Pod如何访问他们上面的服务
  • service就是解决这些问题的

clusterIP

  • 服务的自动跟踪

    • 服务会创建一个clusterIP,这个地址对应资源地址,不管Pod如何变化,服务总能找到对应的Pod,且clusterIP保持不变
  • 服务的负载均衡
    • 如果服务后端对应多个Pod,则会通过IPTables/LVS规则将访问的请求最终映射到Pod的容器内部,自动在多个容器间实现负载均衡
  • 服务的自动发现
    • 服务创建时会自动在内部DNS上注册域名
    • 域名:<服务名称>.<名称空间>.svc.cluster.local
    • cluster.local是在集群创建前,kubeadm-init.yaml文件里定义的,如果公司有自己的域名,可以替换
#mermaid-svg-c6FbJXu0AXj33wbO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .error-icon{fill:#552222;}#mermaid-svg-c6FbJXu0AXj33wbO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-c6FbJXu0AXj33wbO .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-c6FbJXu0AXj33wbO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-c6FbJXu0AXj33wbO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-c6FbJXu0AXj33wbO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-c6FbJXu0AXj33wbO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-c6FbJXu0AXj33wbO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-c6FbJXu0AXj33wbO .marker.cross{stroke:#333333;}#mermaid-svg-c6FbJXu0AXj33wbO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-c6FbJXu0AXj33wbO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .cluster-label text{fill:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .cluster-label span{color:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .label text,#mermaid-svg-c6FbJXu0AXj33wbO span{fill:#333;color:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .node rect,#mermaid-svg-c6FbJXu0AXj33wbO .node circle,#mermaid-svg-c6FbJXu0AXj33wbO .node ellipse,#mermaid-svg-c6FbJXu0AXj33wbO .node polygon,#mermaid-svg-c6FbJXu0AXj33wbO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-c6FbJXu0AXj33wbO .node .label{text-align:center;}#mermaid-svg-c6FbJXu0AXj33wbO .node.clickable{cursor:pointer;}#mermaid-svg-c6FbJXu0AXj33wbO .arrowheadPath{fill:#333333;}#mermaid-svg-c6FbJXu0AXj33wbO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-c6FbJXu0AXj33wbO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-c6FbJXu0AXj33wbO .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-c6FbJXu0AXj33wbO .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-c6FbJXu0AXj33wbO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-c6FbJXu0AXj33wbO .cluster text{fill:#333;}#mermaid-svg-c6FbJXu0AXj33wbO .cluster span{color:#333;}#mermaid-svg-c6FbJXu0AXj33wbO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-c6FbJXu0AXj33wbO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-c6FbJXu0AXj33wbO .Error>*{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;stroke:#f06080!important;stroke-dasharray:6!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Error span{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;stroke:#f06080!important;stroke-dasharray:6!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Cluster>*{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Cluster span{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Node>*{fill:#a5a5f0!important;color:#f0f0f0!important;stroke:#f06080!important;stroke-width:3px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Node span{fill:#a5a5f0!important;color:#f0f0f0!important;stroke:#f06080!important;stroke-width:3px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Pod>*{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .Pod span{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .User>*{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}#mermaid-svg-c6FbJXu0AXj33wbO .User span{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}

k8s cluster
node-0001
node-0002
node-0003
Pod
Client
ClusterIP
service
Pod
Pod
  • 服务的工作原理

    • kube-proxy是在所有节点上运行的代理。可以实现简单的数据转发,可以设置更新IPTables/LVS规则,在服务创建时,还提供服务地址DNS自动注册与服务发现功能

自动注册域名

[root@master ~]# vim mysvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc
spec:type: ClusterIPselector:app: webports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl apply -f mysvc.yaml
service/mysvc created
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1      <none>        443/TCP   2d18h
mysvc        ClusterIP   10.245.1.80     <none>        80/TCP    8s
[root@master ~]# yum install -y bind-utils
# k8s DNS地址
[root@master ~]# kubectl -n kube-system get service
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.245.0.10     <none>        53/UDP,53/TCP,9153/TCP   13d
metrics-server   ClusterIP   10.245.66.175   <none>        443/TCP                  10d
[root@master ~]# host mysvc.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: mysvc.default.svc.cluster.local has address 10.245.1.80

后端Pod

[root@master ~]# vim myweb.yaml
---
kind: Pod
apiVersion: v1
metadata:name: myweblabels:app: web
spec:terminationGracePeriodSeconds: 0restartPolicy: Alwayscontainers:- name: apacheimage: myos:httpdimagePullPolicy: IfNotPresentports:- name: myhttpprotocol: TCPcontainerPort: 80[root@master ~]# sed 's,myweb,web1,' myweb.yaml |kubectl apply -f -
pod/web1 created
[root@master ~]# curl http://10.245.1.80
Welcome to The Apache.# service 靠标签寻找 Pod
[root@master ~]# kubectl label pod web1 app-
pod/web1 labeled
[root@master ~]# curl http://10.245.1.80
curl: (7) Failed connect to 10.245.1.80:80; Connection refused
[root@master ~]# kubectl label pod web1 app=web
pod/web1 labeled
[root@master ~]# curl http://10.245.1.80
Welcome to The Apache.

多个Pod负载均衡

[root@master ~]# sed 's,myweb,web2,' myweb.yaml |kubectl apply -f -
pod/web2 created
[root@master ~]# sed 's,myweb,web3,' myweb.yaml |kubectl apply -f -
pod/web3 created
[root@master ~]# curl -s http://10.245.1.80/info.php |grep php_host
php_host:       web1
[root@master ~]# curl -s http://10.245.1.80/info.php |grep php_host
php_host:       web2
[root@master ~]# curl -s http://10.245.1.80/info.php |grep php_host
php_host:       web3

为服务设置固定IP

  • ClusterIP是随即分配IP的,如果想使用固定IP,可以自定义,但IP的范围必须符合服务的CIDR
[root@master ~]# vim mysvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc
spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: webports:- protocol: TCPport: 80targetPort: myhttp[root@master ~]# kubectl delete -f mysvc.yaml
service "mysvc" deleted
[root@master ~]# kubectl apply -f mysvc.yaml
service/mysvc created
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP   2d18h
mysvc        ClusterIP   10.245.1.80   <none>        80/TCP    65s

服务类型

  • 发布服务

    • ClusterIP服务可以解决集群内应用互访的问题,但外部的应用无法访问集群内的资源,某些应用需要访问集群内的资源,我们需要对外发布服务
  • 服务类型
    • k8s的ServiceTypes允许指定不同的Service类型,以满足不同的需求,有效的类型有:ClusterIP、NodePort、LoadBalancer、ExternaIName
    • ClusterIP:默认类型,只能在集群内部使用,可以实现Pod的自动跟踪与负载均衡,是最核心的服务类型
    • NodePort:通过将真实节点的端口映射到ClusterIP服务上,对外暴露服务的类型
    • LoadBalancer:使用云提供商的负载均衡器,通过外部路由将流量转发到NodePort和ClusterIP服务上
    • ExternaIName:通过CNAME和对应值,可以将外部服务映射到externaIName字段的内容
  • 对外发布服务
    • 使用基于端口映射(默认值:30000-32767)的NodePort对外发布服务,可以发布任意服务(四层)
    • 使用lngress控制器(一般由Nginx或HAProxy构成),用来发布http、https服务(七层)
    • LoadBalancer:使用外部云服务或externaIIPs(需要特定的服务或付费支持)

nodePort

#mermaid-svg-NNCuZyJlcq5IpVL9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .error-icon{fill:#552222;}#mermaid-svg-NNCuZyJlcq5IpVL9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NNCuZyJlcq5IpVL9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .marker.cross{stroke:#333333;}#mermaid-svg-NNCuZyJlcq5IpVL9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .cluster-label text{fill:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .cluster-label span{color:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .label text,#mermaid-svg-NNCuZyJlcq5IpVL9 span{fill:#333;color:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .node rect,#mermaid-svg-NNCuZyJlcq5IpVL9 .node circle,#mermaid-svg-NNCuZyJlcq5IpVL9 .node ellipse,#mermaid-svg-NNCuZyJlcq5IpVL9 .node polygon,#mermaid-svg-NNCuZyJlcq5IpVL9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .node .label{text-align:center;}#mermaid-svg-NNCuZyJlcq5IpVL9 .node.clickable{cursor:pointer;}#mermaid-svg-NNCuZyJlcq5IpVL9 .arrowheadPath{fill:#333333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NNCuZyJlcq5IpVL9 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NNCuZyJlcq5IpVL9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NNCuZyJlcq5IpVL9 .cluster text{fill:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 .cluster span{color:#333;}#mermaid-svg-NNCuZyJlcq5IpVL9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NNCuZyJlcq5IpVL9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Cluster>*{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Cluster span{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Node>*{fill:#a5a5f0!important;color:#f0f0f0!important;stroke:#f06080!important;stroke-width:3px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Node span{fill:#a5a5f0!important;color:#f0f0f0!important;stroke:#f06080!important;stroke-width:3px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Pod>*{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .Pod span{fill:#ccffbb!important;color:#000000!important;stroke-width:3px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .User>*{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}#mermaid-svg-NNCuZyJlcq5IpVL9 .User span{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}

k8s cluster
NodePort
service
node-0001
node-0002
node-0003
Pod
Pod
Pod
Client
[root@master ~]# vim mysvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc
spec:type: NodePort               # 指定服务类型clusterIP: 10.245.1.80selector:app: webports:- protocol: TCPport: 80nodePort: 30080            # 可选配置,如果不指定就使用随即端口targetPort: myhttp[root@master ~]# kubectl apply -f mysvc.yaml
service/mysvc configured
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP        5d18h
mysvc        NodePort    10.245.1.80   <none>        80:30080/TCP   17m# NodePort会在所有节点映射端口,可以访问任意节点
[root@master ~]# curl http://node-0001:30080
Welcome to The Apache.
[root@master ~]# curl http://node-0002:30080
Welcome to The Apache.
[root@master ~]# curl http://node-0003:30080
Welcome to The Apache.

Ingress

  • Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制
  • Ingress控制器通常由负载均衡器来实现(Nginx、HAProxy)
#mermaid-svg-WHvcBdaANBlwHl7Z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .error-icon{fill:#552222;}#mermaid-svg-WHvcBdaANBlwHl7Z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WHvcBdaANBlwHl7Z .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WHvcBdaANBlwHl7Z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WHvcBdaANBlwHl7Z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WHvcBdaANBlwHl7Z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WHvcBdaANBlwHl7Z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WHvcBdaANBlwHl7Z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WHvcBdaANBlwHl7Z .marker.cross{stroke:#333333;}#mermaid-svg-WHvcBdaANBlwHl7Z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WHvcBdaANBlwHl7Z .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .cluster-label text{fill:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .cluster-label span{color:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .label text,#mermaid-svg-WHvcBdaANBlwHl7Z span{fill:#333;color:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .node rect,#mermaid-svg-WHvcBdaANBlwHl7Z .node circle,#mermaid-svg-WHvcBdaANBlwHl7Z .node ellipse,#mermaid-svg-WHvcBdaANBlwHl7Z .node polygon,#mermaid-svg-WHvcBdaANBlwHl7Z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WHvcBdaANBlwHl7Z .node .label{text-align:center;}#mermaid-svg-WHvcBdaANBlwHl7Z .node.clickable{cursor:pointer;}#mermaid-svg-WHvcBdaANBlwHl7Z .arrowheadPath{fill:#333333;}#mermaid-svg-WHvcBdaANBlwHl7Z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WHvcBdaANBlwHl7Z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WHvcBdaANBlwHl7Z .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WHvcBdaANBlwHl7Z .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WHvcBdaANBlwHl7Z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WHvcBdaANBlwHl7Z .cluster text{fill:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z .cluster span{color:#333;}#mermaid-svg-WHvcBdaANBlwHl7Z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WHvcBdaANBlwHl7Z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-WHvcBdaANBlwHl7Z .U>*{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .U span{fill:#ccddee!important;color:#000000!important;stroke:#555555!important;stroke-width:3px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .k8s>*{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .k8s span{fill:#ffffc0!important;color:#ff00ff!important;stroke-width:4px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .Ingress>*{fill:#0000ff!important;color:#ffff00!important;stroke:#f000f0!important;stroke-width:2px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .Ingress span{fill:#0000ff!important;color:#ffff00!important;stroke:#f000f0!important;stroke-width:2px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .Pod>*{fill:#ccffbb!important;color:#000000!important;stroke-width:2px!important;}#mermaid-svg-WHvcBdaANBlwHl7Z .Pod span{fill:#ccffbb!important;color:#000000!important;stroke-width:2px!important;}

Kubernetes cluster
route
rule
route
rule
Ingress-managed
load balancer
Pod
Pod
service
Pod
Pod
service
Ingress
Client

安装Ingress控制器

  • Ingress服务由规则+控制器组成
  • 规则负责制定策略,控制器负责执行
  • 如果没有控制器,单独设置规则无效
  • 获取控制器镜像及资源文件
    • 地址:http://github.com/kubernetes/ingress-nginx
[root@master ingress]# docker load -i ingress.tar.xz
[root@master ingress]# docker images|while read i t _;do[[ "${t}" == "TAG" ]] && continue[[ "${i}" =~ ^"registry:5000/".+ ]] && continuedocker tag ${i}:${t} registry:5000/plugins/${i##*/}:${t}docker push registry:5000/plugins/${i##*/}:${t}docker rmi ${i}:${t} registry:5000/plugins/${i##*/}:${t}
done
[root@master ingress]# sed 's,\(image: \).*/\(.*\),\1registry:5000/plugins/\2,' -i deploy.yaml
328:    image: registry:5000/plugins/controller:v1.1.0
609:    image: registry:5000/plugins/kube-webhook-certgen:v1.1.1
661:    image: registry:5000/plugins/kube-webhook-certgen:v1.1.1[root@master ingress]# kubectl apply -f deploy.yaml
[root@master ingress]# kubectl -n ingress-nginx get pods
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create--1-lm52c     0/1     Completed   0          29s
ingress-nginx-admission-patch--1-sj2lz      0/1     Completed   0          29s
ingress-nginx-controller-5664857866-tql24   0/1     Running     0          29s

创建后端服务

[root@master ~]# vim mysvc.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc
spec:type: ClusterIPclusterIP: 10.245.1.80selector:app: webports:- protocol: TCPport: 80targetPort: 80[root@master ~]# kubectl apply -f mysvc.yaml
service/mysvc configured
[root@master ~]# kubectl get service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1    <none>        443/TCP   5d19h
mysvc        ClusterIP   10.245.1.80   <none>        80/TCP    36m
[root@master ~]# kubectl get pods -l app=web --show-labels
NAME   READY   STATUS    RESTARTS   AGE   LABELS
web1   1/1     Running   0          36m   app=web
web2   1/1     Running   0          34m   app=web
web3   1/1     Running   0          34m   app=web
[root@master ~]# curl http://10.245.1.80
Welcome to The Apache.

对外发布服务

[root@master ~]# kubectl get ingressclasses.networking.k8s.io
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       5m7s
[root@master ~]# vim mying.yaml
---
kind: Ingress                       # 资源对象类型
apiVersion: networking.k8s.io/v1    # 资源对象版本
metadata:                           # 元数据name: mying                        # 资源对象名称
spec:                               # 资源对象定义ingressClassName: nginx         # 使用的类名称rules:                          # ingress规则定义- host: test.zhixi.cn              # 域名定义,没有可以不写http:                           # 协议paths:                      # 访问的路径定义- backend:                 # 后端服务service:                  # 服务声明name: mysvc               # 服务名称port:                 # 端口号声明number: 80           # 访问服务的端口号path: /                       # 访问的url路径pathType: Prefix          # 路径类型(implementationSpecific、Exact 、Prefix)[root@master ~]# kubectl apply -f mying.yaml
ingress.networking.k8s.io/mying created
[root@master ~]# kubectl get ingress
NAME    CLASS   HOSTS         ADDRESS        PORTS   AGE
mying   nginx   test.zhixi.cn   192.168.1.51   80      70s
[root@master ~]# curl -H "Host: test.zhixi.cn" http://192.168.1.51
Welcome to The Apache.

Kubernetes——service管理相关推荐

  1. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目标 部署:掌握将aspnetcore程序成功发布到Azure Kubernetes Service(AKS)上 管理:掌握将AKS上的aspnetcore程序扩容.更新版本 准备工作 注册 Azur ...

  2. kubernetes系列五之service管理

    目录 Service基本概念 定义 Pod的特征 解决方案​编辑 service模型 Endpoint Controller Kube-proxy iptables Kube-proxy IPVS 服 ...

  3. Kubernetes Service 对象的使用

    我们前面的课程中学习了Pod的基本用法,我们也了解到Pod的生命是有限的,死亡过后不会复活了.我们后面学习到的RC和Deployment可以用来动态的创建和销毁Pod.尽管每个Pod都有自己的IP地址 ...

  4. Kubernetes Service(溪恒)

    本文将主要分享以下四方面的内容: 为什么需要 K8s service: K8s service 用例解读: K8s service 操作演示: K8s service 架构设计. 需求来源 为什么需要 ...

  5. 阿里巴巴 Kubernetes 应用管理实践中的经验与教训

    作者 | 孙健波(阿里巴巴技术专家).赵钰莹 导读:云原生时代,Kubernetes 的重要性日益凸显.然而,大多数互联网公司在 Kubernetes 上的探索并非想象中顺利,Kubernetes 自 ...

  6. C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

    关于 Neting 刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关.目前写完了查看 Kubernetes Service 信息.创建 Route 和 Cluster 和绑定 K ...

  7. 容器编排技术 -- Kubernetes Service

    容器编排技术 -- Kubernetes Service 1 定义 Service 1.1 没有 selector 的 Service 2 VIP 和 Service 代理 2.1 userspace ...

  8. 浅谈Kubernetes Service负载均衡实现机制

    女主宣言 Kubernetes Serivce是一组具有相同label Pod集合的抽象(可以简单的理解为集群内的LB),集群内外的各个服务可以通过Service进行互相通信.但是Service的类型 ...

  9. Kubernetes 权限管理

    2019独角兽企业重金招聘Python工程师标准>>> kubernetes 主要通过 APIServer 对外提供服务,对于这样的系统集群来说,请求访问的安全性是非常重要的考虑因素 ...

最新文章

  1. Nginx 代理 WebSocket
  2. sql server datetime格式_为什么你SQL Server中SQL日期转换出错了呢?
  3. asp.net 中ascx、asmx、ashx等文件类型说明
  4. 民间借贷利息多少才合法?
  5. 怎么在mysql查询自己建的表格_oracle数据库中怎么查询自己建的表
  6. 解决Cannot load /usr/local/apache/modules/libphp5.so的方法
  7. micropython 人脸识别检测_Flask实战!从后台管理到人脸识别,六款优质Flask开源项目介绍...
  8. iphonex屏幕出现一条绿线_关于对 iPhone 11、iPhone X? 采用的 Liquid 视网膜显示屏的误区,在此说明。...
  9. 设置UITableView的separatorInset值为UIEdgeInsetsZero,分隔线不最左端显示的问题
  10. C#路径中获取文件全路径、目录、扩展名、文件名称
  11. jsf 导航_JSF动作方法导航示例教程– from-action标记
  12. sql 最外层传值给最内层查询_腾讯云高级工程师如何玩转PG查询处理与执行器算法...
  13. disruptor:CAS实现高效(伪)无锁阻塞队列实践
  14. 设置tomcat 默认访问路径
  15. 图的邻接矩阵求图的出度,入度,可达矩阵,判断强连通,弱连通,单向连通(C++,vs2017)
  16. 远程服务RMI源码解析(二)
  17. Python pywin32(一)
  18. html左侧导航菜单多级,css3多级菜单导航栏、侧边菜单栏
  19. spark出现crossJoin笛卡尔积报错异常解决use the CROSS JOIN syntax to allow cartesian products between these
  20. 李宏毅2023春季机器学习笔记 - 01生成AI(ChatGPT)

热门文章

  1. 重新试用了office与wps.感觉这次wps好多了.
  2. 润和软件携手高鸿信安助力构建可信计算生态
  3. JavaWeb购物平台小项目
  4. Layer 图层圆角、边框 、底纹其他常用操作
  5. “麦田音乐节·超时空歌会”即将破空 探索元宇宙虚拟演唱会新形式
  6. i7 11700k、i7 11700f和i7 11700KF选哪个
  7. 【PHPWord】PHPWord生成图表-柱形图 | 设置数值类别展示、展示多组数据
  8. cpu 占用过高排查
  9. 前端换肤功能如何实现
  10. 思科交换机基础--11三层交换机ACL配置