云原生 kubernetes 中的service

【云原生K8S】Kubernetes之Service K8S的Service配置(ClusterIP、NodePort) 阅读详情

一.理解标签与service中的endpoint

1.建立一个service

[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不会被暴漏

[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出现了

[root@k8s-master services]# kubectl label pods webserver app=webserver
pod/webserver labeled

二.利用service暴漏控制器

1.监控

[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

[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

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

尝试访问

四.service的ipvs模式

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

[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

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

configmap/kube-proxy edited

[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

[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集群内部解析

[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裸漏

[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

[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.端口破限

[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

[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

上传镜像

[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

[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的配置文件

[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

[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文件

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

准备ingress所需镜像

[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

[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

[root@k8s-master ingress-v1.5.1]# kubectl apply -f deploy.yaml

2.ingress功能的基本实现

建立ingress代理的微服务

#业务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

[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

测试:

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

3.基于域名的访问

[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

验证:

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

4.基于动静分离的方式

[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加密访问

[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认证

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

[root@k8s-master ~]# dnf install httpd-tools -y

生成认证文件

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

将认证文件注入k8s中

[root@k8s-master ~]# kubectl create secret generic web-auth --from-file auth

在ingress中配置auth认证

[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中的网页重写

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

[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

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

[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的灰度发布

[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.基于权重的灰度发布

[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"

云原生安全:从K8s RBAC到Service Mesh加密 RBAC(Role-Based Access Control)是K8s中用于控制用户、系统进程或系统组件对Kubernetes资源访问权限的一种机制。它通过定义角色(Role)和集群角色(ClusterRole),并将这些角色绑定到用户、组或服务账户(ServiceAccount)来实现权限分配。Service Mesh是云原生架构中的基础设施层,通过轻量级网络代理(如Sidecar)管理服务间通信,实现流量控制、安全性和可观测性功能。 阅读详情

相关推荐

云原生安全:从 Kubernetes RBAC 到 Service Mesh 加密

在这个多云、微服务和容器化的世界里,安全问题不再是单纯的网络防护,更多的是跨多个层次的全面防护。例如,您可以在 Kubernetes 中配置 RBAC 以控制哪些用户可以管理 Service Mesh 配置,同时使用 Service Mesh 的 mTLS 和身份验证来保障服务间的通信安全。:通过 mTLS 和 JWT 身份验证,Service Mesh 提供了强大的身份验证和数据保护机制,确保只有经过验证的服务才能互相通信。通过这些技术,我们能够更好地保护我们的云原生应用免受潜在的安全威胁。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1163

【云原生kubernetes】k8s service使用详解

在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,重启pod的ip地址会发生变化,此时客户如果访问原先的ip地址则会报错;Service (服务)就是用来解决这个问题的, 对外服务的统一入口,防止pod失联,定义一组pod的访问策略(服务发现、负载均衡);一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的 ,Service是一个概念,主要作用的是节点上的kube-proxy服务进程;

我快乐,我自由。 3329

云原生(二十) | Kubernetes篇】深入了解Kubernetes(k8s)Service

Service 创建完成后,会对应一组EndPoint。可以kubectl get ep 进行查看 type有四种,每种对应不同服务发现机制 Servvice可以利用Pod的就绪探针机制,只负载就绪了的Pod。自动剔除没有就绪的Pod 原理:kube-proxy 在负责这个事情 手动指定的ClusterIP必须在合法范围内 None会创建出没有ClusterIP的headless service(无头服务),Pod需要用服务的域名访问

Lansonli(蓝深李)的博客 1603

【云原生 | Kubernetes 系列】—K8s-Service 的概念

K8s-Service 的概念。

云录 1266

云原生之深入解析Kubernetes中K8S Service的基础使用及实现原理

ClusterIP 类型,KubeProxy 监听 Service 和 Endpoint 创建规则,采用 DNAT 将目标地址转换为 Pod 的 ip 和端口,当有多个 ep 时,按照策略进行转发,默认 RR 模式时,iptables 采用:比如有 4 个实例,四条规则的概率分别为 0.25, 0.33, 0.5 和 1,按照顺序,一次匹配完成整个流量的分配。

╰つ栺尖篴夢ゞ 1456

【云原生技术】- Consul、Nacos与service在Kubernetes 中的应用

定义Consul 是由 HashiCorp 公司开发的一款开源服务发现和配置工具,主要用于现代分布式系统中的服务网络协调和管理。核心功能服务发现:允许服务通过 HTTP 或 DNS 接口注册自身,并让其他服务发现并连接。健康检查:提供健康检查机制以监控服务的状态。Key/Value 存储:提供用于存储配置信息和其他数据的键值存储。多数据中心:支持跨多个数据中心的服务。使用场景微服务架构中服务的注册与发现。配置的中心化管理和分发。跨数据中心的服务网络管理。举例。

weixin_46453070的博客 1170

云原生架构深度实践:从Kubernetes到Service Mesh的进化之路

云原生架构深度实践》通过系统化扩容策略(总字数增至20100字),构建覆盖Kubernetes源码解析、ServiceMesh高阶应用及行业攻坚案例的完整知识体系。核心升级包含:1)技术纵深扩展,新增调度算法数学证明等7个源码级分析模块;2)强化企业级实践,提供12个经万级节点验证的生产模板;3)首创行业全景视角,披露金融/政务/工业物联网三大领域落地路径。创新性地融入交互式检测工具、多模态学习资源及合规即代码等前沿内容,并通过生产环境真实数据与授权故障案例确保内容可信度。配套提供Kind实验环境和持续更新

2503_92509533的博客 1052

219页华为供应链管理:市场预测S&OP计划、销售预测与存货管理精要

S&OP计划的整合作用:S&OP是一种综合的销售和运营计划流程,它将市场预测、生产能力、库存水平和财务目标整合在一起,以确保企业能够平衡供需,实现最佳的运营效率。持续监控与改进:市场预测、S&OP计划、计划委员会的决策以及存货管理都需要持续的监控和评估。供应链策略与执行:华为ISC拥有清晰的供应链策略,并通过SISC架构实现了策略的有效执行,包括供应链网络设计、库存管理、物流优化等。持续的供应链创新:华为ISC不断探索新的供应链管理方法和技术,如数字化供应链、智能物流等,以适应全球化和市场的快速变化。

zuoan1993的博客 2433

golang云原生之Kubernetes Service

由于Kubernetes Service抽象了一组Pods,并为它们提供了稳定的访问地址,因此我们可以在进行微服务开发时,将关注点从实例级别转移到服务级别,更加专注于服务的设计和开发。希望本文对您有所帮助。而作为Kubernetes中的基本概念之一,Service是一项非常重要的功能,可以帮助开发者在Kubernetes集群中创建一个稳定的服务访问端口,并通过这个端口来提供服务。Golang是一种快速且易于使用的编程语言,其具有高效的内存管理机制和并发编程的能力,成为云原生应用开发中非常受欢迎的开发语言。

SMILY12138的博客 223

DID实战指南:从平行趋势检验到PSM-DID的Stata全流程解析

本文详细解析了双重差分法(DID)在政策评估中的应用,从平行趋势检验到PSM-DID的Stata全流程操作。通过实例演示和代码示例,帮助研究者掌握DID方法的核心逻辑、前提条件验证及稳健性检验技巧,提升因果推断研究的准确性。

weixin_29234239的博客 741

Elsevier投稿实战:从ESWA模板到录用通知的全流程拆解

本文详细拆解了Elsevier旗下期刊ESWA(Expert Systems With Applications)的投稿全流程,从模板选择、投稿系统操作到审稿意见回复和录用后注意事项。重点分享了单栏LaTeX模板调整、APA文献格式处理、Highlights撰写技巧等实战经验,帮助研究者高效完成投稿并提升录用概率。

weixin_32715349的博客 238

云原生 | Kubernetes篇】深入了解Kubernetes(k8s)Service(十一)

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。 Service 创建完成后,会对应一组EndPoint。可以kubectl get ep 进行查看 type有四种,每种对应不同服务发现机制 Servvice可以利用Pod的就绪探针机制,只负载就绪了的Pod。自动剔除没有就绪的Pod 2、创建无Selector的Service 我们可以创建Service不指定Selector 然后手动创建EndPoint,指定一组Pod地址 此场景用于我们负载均衡其他中间件场景 原理: kube-p

m0_54252387的博客 312

app编写需要哪种语言

原生App开发:优选Swift(iOS)和Kotlin(Android)。跨平台App开发:优选Flutter(Dart)和React Native(JavaScript)。游戏App开发:优选Unity(C#)和Unreal Engine(C++)。低代码工具:适合简单、快速的App制作。

fanying_98的博客 2070

【云原生 • Kubernetes】kubernetes 核心技术 - Service

Kubernetes 核心技术之 Service 概念以及用法详细介绍。

商务合作 | 共同学习 | 携手共进 5万+

YOLOv11 改进 - 即插即用 | PST金字塔稀疏Transformer:粗粒度到细粒度推理优化特征提取,提升复杂场景适应性

本文介绍了金字塔稀疏 Transformer(PST)与 YOLOv11 的结合。主流基于注意力的特征融合方法计算复杂度高、实现难度大,作者提出 PST 模块,融合粗到细令牌选择与共享注意力参数机制,在保留空间细节的同时降低计算量。该模块通过层级化注意力机制、动态令牌选择与参数共享,实现高效多尺度特征融合

魔改工程师的博客 830

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

采用软核进行串口升级的原因主要有以下几点:1、官方推荐:官方以前也推出了针对逻辑进行升级的程序《XAPP1081_QuickBoot》,但是从今年起(2024年)官方就停止更新相关例程了(详见下面截图),所以采用官方推荐的软核更新;2、简单并具有通用性:针对SPI或者BPI官方都有相关的IP,可应对市场上80%以上的FLASH,并且官方IP通用性极强,只需要修改几个参数就可以对不同厂家的芯片进行升级操作;

OpenFPGA的博客 1996

云原生:kubernetes的service

kubectl get pods -o wide --show-labels " 监控。kube‑proxy 把 Service 的 ClusterIP/NodePort 转换成内核转发规则,拦截访问 Service 的流量,调度转发到后端 Endpoints (Pod)当设定此模式,那么service不会被分配一个ip而是直接把endpoints上的ip直接通过dns裸漏。集群内部通常使用service的解析名称进行通信地址的指定,因为资源的ip会变但是名字不会。

nxb556的博客 326

高分六号WFV预处理详细步骤(辐射校正、大气校正、几何校正)

高分六号WFV传感器获得的影像的预处理分为两个步骤:辐射校正和大气校正,辐射校正为了消除传感器的自身误差,大气校正为了消除大气的折射误差。 一、辐射校正 按照红框中信息进行更改。 辐射校正前地物光谱反射率: 校正后的地物光谱曲线的变化: 二、大气校正 ENVI中大气校正一般采用Flaash模型,但是这个模型需要设置许多的参数十分的麻烦,所以采用ENVI商店(app store,这个也需要下载的)里的Flaash Easy To Use 这个插件,可以快速地进行大气校正。 大气校正后的地物反射率 这

qq_41828818的博客 1万+

在优快云学Golang云原生(Kubernetes Service)

因此,在使用Ingress时,需要先定义好所需的Service,并将它们标记为需要通过Ingress暴露出来的服务。需要注意的是,在进行发布之前,请确保已经创建了相关的 Deployment 或 StatefulSet 等资源,并且已经正确标记了相关的 Pod 和 Endpoint。最后,在应用程序中更新相关代码,使其支持HTTPS协议即可。需要注意的是,在部署Ingress Controller之前,需要确保已经正确设置了Kubernetes集群中的网络插件,并且Node节点都已经正确配置和准备好。

YKM_2580的博客 958

python+playwright 学习-10.pytest-playwright插件编写测试用例

pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。

qq_27371025的博客 2510

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

从零理解Kubernetes三大核心对象:Pod、Deployment、Service —— 云原生时代的基石

在当今的云原生世界中,已成为容器编排领域的“操作系统”。无论是初创公司还是大型企业,都在借助 Kubernetes 构建高可用、可扩展的分布式系统。然而,对于初学者而言,Kubernetes 庞大的概念体系常常令人望而生畏。其中,是最基础、最核心的三个对象,它们构成了 Kubernetes 应用部署的“黄金三角”。本文将带你从零开始,深入浅出地理解这三个核心对象的本质、作用与协作机制,帮助你构建清晰的认知框架,为后续深入学习打下坚实基础。Pod:是运行容器的“家”,共享网络与存储。

用文字记录技术,用分享回馈社区,用坚持见证成长 1846

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(下)

K8s 四层代理 Service 入门到企业实战应用之 NodePort、ExternalName 案例

GG Bond 的博客 876

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(上)

K8s 四层代理 Service 入门到企业实战应用之 service NodePort类型

GG Bond 的博客 1145

程序员生存指南09-云原生与AI融合:2026年最热门的技术方向,Kubernetes+Service Mesh+AIOps:云原生架构师的核心武器

云原生不是一门技术,而是一种思维方式。从"能跑就行"到"弹性自愈"从"人工运维"到"GitOps"从"成本黑盒"到"FinOps"从"被动救火"到"AIOps预测"这条路很长,但每一步都值得。2026年,愿你的Pod永不Crash,服务永远Available,账单永远可控。本文首发于优快云,转载请注明出处。云原生, Kubernetes, ServiceMesh, FinOps, AIOps, 边缘计算。

weitingfu的博客 775

【Kubernetes】什么是Kubernetes(K8s):容器编排的王者

Kubernetes(K8s)是开源的容器编排平台,自动化管理容器化应用的部署、扩展和维护。源自Google的Borg系统,现由CNCF维护,已成为云原生生态的核心。其核心概念包括Pod、Deployment、Service等,采用主从架构实现高可用管理。K8s通过声明式配置自动调度容器,支持故障恢复、滚动更新和弹性扩缩容。优势包括跨云可移植性、丰富生态和高效资源利用,但存在学习曲线陡峭和运维复杂的缺点。适用于微服务、CI/CD、AI等场景,是构建可扩展云应用的重要工具。

彬彬侠的博客 1974

云原生项目二

本项目基于MySQL8.0与开源大模型API,构建电商订单库智能查询与性能调优系统,实现自然语言转SQL、自动执行、执行计划分析及索引优化,无需专业SQL能力。在openEuler环境下完成网络配置、YUM源设置、时间同步、防火墙关闭及Python3.11编译安装,部署MySQL8.0.45并接入阿里云大模型API,最终通过Streamlit实现可视化交互,完成从环境搭建到AI智能运维的全流程落地。

zfm242397396的博客 202
上一篇: 云原生 kubenetes 控制器管理
UseLessQQ
博客等级 码龄3年 73粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值