云原生 kubernetes 中的service

一.理解标签与service中的endpoint

1.建立一个service

bash 复制代码
[root@k8s-master services]# kubectl create service  clusterip  --tcp 80:80 testservice --dry-run=client -o yaml >> testservice.yaml

[root@k8s-master services]# vim testservice.yaml
-------------------------------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
  labels:
    app: testservice
  name: testservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: webserver
  type: ClusterIP
-------------------------------------------------------------------------------------------

[root@k8s-master services]# kubectl apply -f testservice.yaml
service/testservice created


[root@k8s-master ~]# watch -n 1 "kubectl describe svc testservice ; kubectl get pods --show-labels "

可以看到endpoints为空

2.建立pod并测试pod是否可以被testservice暴漏

当标签与service选择器上的标签不同,pod不会被暴漏

bash 复制代码
[root@k8s-master services]# kubectl run  webserver --image myapp:v1 --dry-run=client -o yaml > webserver.yml
[root@k8s-master services]# vim webserver.yml
-------------------------------------------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: myapp:v1
    name: webserver
-------------------------------------------------------------------------------------------
[root@k8s-master services]# kubectl apply -f webserver.yml

查看监控,可以看到endpoints依旧为空

更改标签后看监控,可以看到endpoints出现了

bash 复制代码
[root@k8s-master services]# kubectl label pods webserver app=webserver
pod/webserver labeled

二.利用service暴漏控制器

1.监控

bash 复制代码
[root@k8s-master ~]# watch -n 1 "kubectl describe svc webservice ; kubectl get deploy --show-labels;kubectl get pods -o wide --show-labels "

2.生成控制器和service的组合yaml

bash 复制代码
[root@k8s-master services]# kubectl create service  clusterip  --tcp 80:80 webservice --dry-run=client -o yaml >> webservice.yaml
[root@k8s-master services]# kubectl create deployment webcluster --image myapp:v1 --dry-run=client -o yaml >>webservice.yaml
[root@k8s-master services]# vim webservice.yaml
-----------------------------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: webcluster
  type: ClusterIP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
-----------------------------------------------------------------------------------------

3.生成控制器和service

bash 复制代码
[root@k8s-master services]# kubectl apply -f webservice.yaml

尝试访问

四.service的ipvs模式

1.在所有节点中安装ipvsadm工具

bash 复制代码
[root@k8s-master ~]# for name in 100 10 20 200
> do
> ssh -l root 172.25.254.$name "dnf install ipvsadm -y"
> done

2.配置集群中的kube-proxy

bash 复制代码
[root@k8s-master ~]# kubectl -n kube-system edit cm kube-proxy
59     mode: "ipvs"

configmap/kube-proxy edited
bash 复制代码
[root@k8s-master services]# kubectl -n kube-system delete pods kube-proxy-2bq67 kube-proxy-fffq7 kube-proxy-rcdgn
pod "kube-proxy-2bq67" deleted from kube-system namespace
pod "kube-proxy-fffq7" deleted from kube-system namespace
pod "kube-proxy-rcdgn" deleted from kube-system namespace

效果

五.Sevice的ClusterIP 类型

1.clusterip

bash 复制代码
[root@k8s-master services]# vim webservice.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: webcluster
  type: ClusterIP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp
        
[root@k8s-master services]# kubectl apply -f webservice.yaml
service/webservice created
deployment.apps/webcluster created

2.在k8s集群内部解析

bash 复制代码
[root@k8s-master services]# kubectl -n kube-system get svc
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
calico-typha   ClusterIP   10.101.113.193   <none>        5473/TCP                 46h
kube-dns       ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   8d

3.clusterIP的headless模式

此模式下service不会被分配一个ip,而是直接把endpoints上的ip直接通过dns裸漏

bash 复制代码
[root@k8s-master services]# vim webservice.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: webcluster
  type: ClusterIP
  clusterIP: None

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master services]# kubectl apply -f webservice.yaml
service/webservice created
deployment.apps/webcluster created

可以发现没有vip

查看解析

六.service的nodeport模式

1.生成nodeport

bash 复制代码
[root@k8s-master services]# vim nodeport.yaml

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30951					#指定端口,如不写会从30000~32767之间随机分
  selector:
    app: webcluster
  type: NodePort					#nodeport模式

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master services]# kubectl apply -f nodeport.yaml
service/webservice created
deployment.apps/webcluster created

2.查看策略

访问

4.端口破限

bash 复制代码
[root@k8s-master services]# vim nodeport.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 44444		        #书写范围外的端口
  selector:
    app: webcluster
  type: NodePort					

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master services]# kubectl apply -f nodeport.yaml
deployment.apps/webcluster unchanged
The Service "webservice" is invalid: spec.ports[0].nodePort: Invalid value: 44444: provided port is not in the valid range. The range of valid ports is 30000-32767

[root@k8s-master services]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
42     - --service-node-port-range=30000-50000


[root@k8s-master services]# kubectl -n kube-system delete pods  all
[root@k8s-master services]# kubectl apply -f nodeport.yaml
service/webservice created
deployment.apps/webcluster created

七.loadbalancer

1.建立service

bash 复制代码
[root@k8s-master services]# vim loadbalancer.yml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: webservice
  name: webservice
spec:
  ports:
  - name: webport
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: webcluster
  type: LoadBalancer				#指定模式

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: webcluster
  name: webcluster
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webcluster
  template:
    metadata:
      labels:
        app: webcluster
    spec:
      containers:
      - image: myapp:v1
        name: myapp

[root@k8s-master services]# kubectl apply -f loadbalancer.yml
service/webservice created
deployment.apps/webcluster created

2.构建metalLB

上传镜像

bash 复制代码
[root@k8s-master services]# tar zxf metallb-v0.16.1.tar.gz
[root@k8s-master metaLLB]# docker load  -i metallb-v0.16.1.tar
[root@k8s-master metaLLB]# docker tag quay.io/metallb/controller:v0.16.1 reg.timinglee.org/metallb/controller:v0.16.1
[root@k8s-master metaLLB]# docker tag quay.io/metallb/speaker:v0.16.1 reg.timinglee.org/metallb/speaker:v0.16.1
[root@k8s-master metaLLB]# docker push  reg.timinglee.org/metallb/controller:v0.16.1
[root@k8s-master metaLLB]# docker push reg.timinglee.org/metallb/speaker:v0.16.1

更改kube-proxy

bash 复制代码
[root@k8s-master mateLLB]# kubectl edit configmap -n kube-system kube-proxy
configmap/kube-proxy edited
59     mode: "ipvs"
60     ipvs:
61       strictARP: true


[root@k8s-master mateLLB]# kubectl -n kube-system get pods
NAME                                 READY   STATUS    RESTARTS        AGE
coredns-697886855d-5whcs             1/1     Running   0               24m
coredns-697886855d-wcrt5             1/1     Running   0               24m
etcd-k8s-master                      1/1     Running   1 (3d23h ago)   24m
kube-apiserver-k8s-master            1/1     Running   0               24m
kube-controller-manager-k8s-master   1/1     Running   2 (27m ago)     24m
kube-proxy-57bhn                     1/1     Running   0               24m
kube-proxy-854kz                     1/1     Running   0               24m
kube-proxy-cnq7t                     1/1     Running   0               24m
kube-proxy-s9plr                     1/1     Running   0               24m
kube-scheduler-k8s-master            1/1     Running   2 (27m ago)     24m
[root@k8s-master mateLLB]# kubectl -n kube-system delete pods  kube-proxy-57bhn kube-proxy-854kz  kube-proxy-cnq7t kube-proxy-s9plr
pod "kube-proxy-57bhn" deleted from kube-system namespace
pod "kube-proxy-854kz" deleted from kube-system namespace
pod "kube-proxy-cnq7t" deleted from kube-system namespace
pod "kube-proxy-s9plr" deleted from kube-system namespace
[root@k8s-master mateLLB]# kubectl -n kube-system get pods
NAME                                 READY   STATUS    RESTARTS        AGE
coredns-697886855d-5whcs             1/1     Running   0               25m
coredns-697886855d-wcrt5             1/1     Running   0               25m
etcd-k8s-master                      1/1     Running   1 (3d23h ago)   25m
kube-apiserver-k8s-master            1/1     Running   0               25m
kube-controller-manager-k8s-master   1/1     Running   2 (27m ago)     25m
kube-proxy-c6snt                     1/1     Running   0               2s
kube-proxy-m7wdg                     1/1     Running   0               2s
kube-proxy-p94tw                     1/1     Running   0               2s
kube-proxy-pdbxw                     1/1     Running   0               2s
kube-scheduler-k8s-master            1/1     Running   2 (27m ago)     25m

更改metallb的配置文件

bash 复制代码
[root@k8s-master metaLLB]# vim 1-metallb-native.yaml
2136:        image: metallb/controller:v0.16.1
2233:        image: metallb/speaker:v0.16.1


[root@k8s-master metaLLB]# vim 2-metallb-confmap.yml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.25.254.50-172.25.254.99


---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
  
  
[root@k8s-master metaLLB]# kubectl apply -f 2-metallb-confmap.yml  -f 1-metallb-native.yaml

验证

八.extrnalname

bash 复制代码
[root@k8s-master services]# vim extrnalname.yaml

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: extrnalname
  name: extrnalname
spec:
  selector:
    app: extrnalname
  type: ExternalName
  externalName: www.timinglee.org

[root@k8s-master services]# kubectl apply -f extrnalname.yaml
service/extrnalname created
[root@k8s-master services]# kubectl get svc extrnalname
NAME          TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)   AGE
extrnalname   ExternalName   <none>       www.timinglee.org   <none>    5s

九.ingress七层代理

1.ingress部署

下载deploy文件

bash 复制代码
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.15.1/deploy/static/provider/baremetal/deploy.yaml

准备ingress所需镜像

bash 复制代码
[root@k8s-master ingress-v1.5.1]# docker load  -i ingress-v1.15.1.tar
[root@k8s-master ingress-v1.5.1]# docker tag registry.k8s.io/ingress-nginx/controller:v1.15.1  reg.timinglee.org/ingress-nginx/controller:v1.15.1
[root@k8s-master ingress-v1.5.1]# docker push  reg.timinglee.org/ingress-nginx/controller:v1.15.1

[root@k8s-master ~]# docker tag registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.6.9 reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.6.9
[root@k8s-master ~]# docker push  reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.6.9

更改deploy.yaml

bash 复制代码
[root@k8s-master ingress-v1.5.1]# vim deploy.yaml
444:        image: ingress-nginx/controller:v1.15.1
547:        image: ingress-nginx/kube-webhook-certgen:v1.6.9
603:        image: ingress-nginx/kube-webhook-certgen:v1.6.9
365   		type: LoadBalancer

通过deplay.yaml部署ingress

bash 复制代码
[root@k8s-master ingress-v1.5.1]# kubectl apply -f deploy.yaml

2.ingress功能的基本实现

建立ingress代理的微服务

bash 复制代码
#业务1
[root@k8s-master services]# kubectl create deployment myappv1 --image myapp:v1 --replicas 2 --dry-run=client -o yaml > myappv1.yaml
[root@k8s-master services]# kubectl create service clusterip servicev1 --tcp 80:80 --dry-run=client -o yaml  >> myappv1.yaml

[root@k8s-master services]# vim myappv1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myappv1
  name: myappv1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myappv1
  template:
    metadata:
      labels:
        app: myappv1
    spec:
      containers:
      - image: myapp:v1
        name: myapp
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: servicev1
  name: servicev1
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myappv1
  type: ClusterIP

#业务2
[root@k8s-master services]# vim myappv2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myappv2
  name: myappv2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myappv2
  template:
    metadata:
      labels:
        app: myappv2
    spec:
      containers:
      - image: myapp:v2
        name: myapp
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: servicev2
  name: servicev2
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myappv2
  type: ClusterIP

[root@k8s-master services]# kubectl apply -f myappv2.yaml
deployment.apps/myappv2 created
service/servicev2 created

[root@k8s-master ingress-v1.5.1]# kubectl apply -f myappv1.yaml
deployment.apps/myappv1 created
service/servicev1 created

建立ingress

bash 复制代码
[root@k8s-master services]# kubectl create ingress  ingress1 --class nginx --rule "*/=servicev1:80" --dry-run=client -o yaml > 1-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: 'www.timinglee.org'
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /v1
        pathType: Prefix

      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path: /v2
        pathType: Prefix
        
[root@k8s-master services]# kubectl apply -f 1-ingress.yml

测试:

bash 复制代码
[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org

3.基于域名的访问

bash 复制代码
[root@k8s-master services]# vim 2-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    #  nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: myapp1.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix

  - host: myapp2.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master services]# kubectl apply -f 2-ingress.yaml
ingress.networking.k8s.io/ingress1 created

验证:

bash 复制代码
[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org myapp1.timinglee.org myapp2.timinglee.org

4.基于动静分离的方式

bash 复制代码
[root@k8s-master ingress-v1.5.1]# vim 3-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /index.html
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /php
        pathType: ImplementationSpecific

      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path: /static
        pathType: ImplementationSpecific

[root@k8s-master ingress-v1.5.1]# kubectl apply -f 3-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

5.tls加密访问

bash 复制代码
[root@k8s-master ~]# openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt
............+...+.......+...+.....+++++++++++++++++++++++++++++++++++++++*..+...........+....+..+...+......+.........+.+...+..+.........+............+....+...+.....+.+..+...+++++++++++++++++++++++++++++++++++++++*....+..+.............+..............+.+.....+.+...+............+.....+.+.....+.......+...+..+...+...............+...+.......+..+...+...+......+..........+.....+.+............+..+.+............+.................+....+..+.......++++++
...+...........+...+.+..+...+++++++++++++++++++++++++++++++++++++++*...+......+.+++++++++++++++++++++++++++++++++++++++*.................+.+..+.+...............+..+....+.........+..+....+...+......+...........+......+...+.+...+........+.........+......+...+....+...+..+.+......+...+............+.........+.....+....+......+....................+....+............+.....+.+...+...........+..........+...+..+....+.....+.+........+.+.........+..+...+.............+........+......+.+.....+...+....+......+...........+...+..........+......+..............+.+............+..+.......+...........+.........+......+....+...+...+...+..+...+......+.+.........+........+.+.....+....+...+...+.....+....+...+..............+.+..+.+.....+......++++++

kubectl create secret tls  web-tls-secret --key tls.key --cert tls.crt
secret/web-tls-secret created

[root@k8s-master services]# vim 4-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"	#访问强制跳转到https
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - myapp-tls.timinglee.org
    secretName: web-tls-secret
  ingressClassName: nginx
  rules:
  - host: myapp-tls.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix


[root@k8s-master services]# kubectl apply -f 4-ingress.yml
ingress.networking.k8s.io/ingress1 configured


[Administrator.DESKTOP-VJ307M3] ➤ vim /etc/hosts
172.25.254.50 www.timinglee.org myapp1.timinglee.org myapp2.timinglee.org myapp-tls.timinglee.org

6.auth认证

安装生成认证文件模板工具

bash 复制代码
[root@k8s-master ~]# dnf install httpd-tools -y

生成认证文件

bash 复制代码
[root@k8s-master ~]# htpasswd -cm auth admin
[root@k8s-master ~]# cat auth
admin:$apr1$aZ.p1QRa$SABH4tQ7RuMmlDkMVGSdc.

将认证文件注入k8s中

bash 复制代码
[root@k8s-master ~]# kubectl create secret generic web-auth --from-file auth

在ingress中配置auth认证

bash 复制代码
[root@k8s-master services]# vim 5-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: web-auth
    nginx.ingress.kubernetes.io/auth-realm: "Please input username and password"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /v1
        pathType: Prefix

[root@k8s-master services]# kubectl apply -f 5-ingress.yaml

验证auth

7.ingress中的网页重写

利用网页从写定义默认发布文件

bash 复制代码
[root@k8s-master services]# vim 6-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/app-root: /hostname.html
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix
        
        
[root@k8s-master services]# kubectl apply -f 6-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

利用正侧表达式从定向网页

bash 复制代码
[root@k8s-master services]# vim 6-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix

      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path:  /lee(/*.*/*|$)(.*)
        pathType: ImplementationSpecific

[root@k8s-master services]# kubectl apply -f 6-ingress.yaml
ingress.networking.k8s.io/ingress1 configured

十.金丝雀发布(cannary)

1.基于headr的灰度发布

bash 复制代码
[root@k8s-master services]# vim cannary.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "version"
    nginx.ingress.kubernetes.io/canary-by-header-value: "2"
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master services]# kubectl apply -f cannary.yaml
ingress.networking.k8s.io/ingress1 configured
ingress.networking.k8s.io/ingress2 created

2.基于权重的灰度发布

bash 复制代码
[root@k8s-master services]# vim cannary.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
  annotations:
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev1
            port:
              number: 80
        path: /
        pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
    nginx.ingress.kubernetes.io/canary-weight-total: "100"
spec:
  ingressClassName: nginx
  rules:
  - host: www.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: servicev2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master services]# kubectl apply -f cannary.yaml
ingress.networking.k8s.io/ingress1 unchanged
ingress.networking.k8s.io/ingress2 configured
[root@k8s-master services]# kubectl get  ingress
NAME       CLASS   HOSTS               ADDRESS         PORTS   AGE
ingress1   nginx   www.timinglee.org   172.25.254.20   80      21m
ingress2   nginx   www.timinglee.org   172.25.254.20   80      98s
[root@k8s-master services]# vim check_cannary.sh

#!/bin/bash
v1=0
v2=0

for (( i=0; i<100; i++))
do
    response=`curl -s www.timinglee.org |grep -c v1`

    v1=`expr $v1 + $response`
    v2=`expr $v2 + 1 - $response`

done
echo "v1:$v1, v2:$v2"
相关推荐
大大大大晴天️1 小时前
把湖仓一体放进 K8s:Iceberg、Hudi、Paimon 如何重塑云原生大数据架构
大数据·云原生·kubernetes
智购科技无人售货机工厂1 小时前
2026自动售货机云端API设计规范:从RESTful到GraphQL的接口演进~YH
android·人工智能·驱动开发·单片机·云原生·pandas·设计规范
毕竟是shy哥1 小时前
windows电脑WSL下本地构建docker镜像
windows·docker·容器
小灰灰搞电子3 小时前
Rust 相关容器(集合)详解
开发语言·容器·rust
上学的小垃圾9 小时前
基于docker安装MySQL(openEuler系统)
linux·mysql·docker·容器
Asum1ta17 小时前
Kubernetes Namespace 命名空间管理实战:资源隔离、默认命名空间与常用命令
网络·容器·kubernetes
雨辰AI17 小时前
信创数仓分层建模|国产数据库 ODS/DWD/DWS 分层落地规范(金仓 / 达梦 / 高斯适配)
数据库·云原生·政务
Asum1ta18 小时前
K8s 学习环境搭建:Python 与 PyCharm 开发环境配置指南
python·学习·kubernetes
阿里云云原生18 小时前
实验:回测、离线实验平台与题目级 Rubric丨AgentLoop 数据飞轮实践(四)
云原生·agent