
续接上文,我们来看下如何进行访问控制吧~~~

访问控制
[root@node1 ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-ds-q2pjt 1/1 Running 35 26dnginx-ds-zc5qt 1/1 Running 40 32dspringboot-web-demo-5c9446ffbf-qvq69 1/1 Running 1 15h[root@node1 ~]#
[root@node1 ~]# kubectl get pod springboot-web-demo-5c9446ffbf-qvq69 -o yaml | grep imagef:image: {}f:imagePullPolicy: {}- image: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1imagePullPolicy: IfNotPresentimage: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1imageID: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web@sha256:1953bfa3859e02f7f8ab10e5b69a0505c738f2d05040be6222e63c2971e8b45d[root@node1 ~]#
[root@node1 ~]# cd namespace/[root@node1 namespace]# mkdir control[root@node1 namespace]# cd control/[root@node1 control]#[root@node1 control]# vim control-ceshi.yaml#deployapiVersion: apps/v1kind: Deploymentmetadata:name: springboot-web-demo-newspec:selector:matchLabels:app: springboot-web-demoreplicas: 1template:metadata:labels:app: springboot-web-demospec:containers:- name: springboot-web-demoimage: registry.cn-beijing.aliyuncs.com/yunweijia0909/tomcat:jre8-openjdkports:- containerPort: 8080---#serviceapiVersion: v1kind: Servicemetadata:name: springboot-web-demospec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: springboot-web-demotype: ClusterIP---#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: springboot-web-demospec:rules:- host: springboot.yunweijia.comhttp:paths:- backend:serviceName: springboot-web-demoservicePort: 80path:[root@node1 control]#[root@node1 control]#
可以看到我们使用了同样的域名,但是镜像不一样,当然了,我们使用的配置https,还是和上文是一样的,如下(只需要执行一个就行,因为域名是一样的):
[root@node1 control]# cat web-demo-ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:name: springboot.yunweijia.comspec:rules:- host: springboot.yunweijia.comhttp:paths:- backend:serviceName: springboot-web-demoservicePort: 80path: /tls:- hosts:- springboot.yunweijia.comsecretName: yunweijia-tls[root@node1 control]#


[root@node1 control]# vim ingress-session.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:annotations:nginx.ingress.kubernetes.io/affinity: cookienginx.ingress.kubernetes.io/session-cookie-hash: sha1nginx.ingress.kubernetes.io/session-cookie-name: routename: springboot-web-demospec:rules:- host: springboot.yunweijia.comhttp:paths:- backend:serviceName: springboot-web-demoservicePort: 80path: /tls:- hosts:- springboot.yunweijia.comsecretName: yunweijia-tls[root@node1 control]#

2、流量控制
[root@node1 control]# cd ../tls/[root@node1 tls]# kubectl create secret tls yunweijia-tls --key yunweijia.key --cert yunweijia.crt -n canary
[root@node1 control]# mkdir canary[root@node1 control]# cd canary/[root@node1 canary]# vim web-canary-a.yaml#deployapiVersion: apps/v1kind: Deploymentmetadata:name: web-canary-anamespace: canaryspec:strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdateselector:matchLabels:app: web-canary-areplicas: 1template:metadata:labels:app: web-canary-aspec:containers:- name: web-canary-aimage: registry.cn-beijing.aliyuncs.com/yunweijia0909/springboot-web:v1ports:- containerPort: 8080livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 20periodSeconds: 10failureThreshold: 3successThreshold: 1timeoutSeconds: 5readinessProbe:httpGet:path: /hello?name=testport: 8080scheme: HTTPinitialDelaySeconds: 20periodSeconds: 10failureThreshold: 1successThreshold: 1timeoutSeconds: 5---#serviceapiVersion: v1kind: Servicemetadata:name: web-canary-anamespace: canaryspec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: web-canary-atype: ClusterIP[root@node1 canary]# vim web-canary-b.yaml#deployapiVersion: apps/v1kind: Deploymentmetadata:name: web-canary-bnamespace: canaryspec:strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdateselector:matchLabels:app: web-canary-breplicas: 1template:metadata:labels:app: web-canary-bspec:containers:- name: web-canary-bimage: registry.cn-beijing.aliyuncs.com/yunweijia0909/tomcat:jre8-openjdkports:- containerPort: 8080---#serviceapiVersion: v1kind: Servicemetadata:name: web-canary-bnamespace: canaryspec:ports:- port: 80protocol: TCPtargetPort: 8080selector:app: web-canary-btype: ClusterIP[root@node1 canary]#
[root@node1 canary]# kubectl create ns canarynamespace/canary created[root@node1 canary]# kubectl apply -f web-canary-a.yamldeployment.apps/web-canary-a createdservice/web-canary-a created[root@node1 canary]# kubectl apply -f web-canary-b.yamldeployment.apps/web-canary-b createdservice/web-canary-b created[root@node1 canary]#
[root@node1 canary]# vim ingress-common.yaml#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: web-canary-anamespace: canaryspec:rules:- host: canary.yunweijia.comhttp:paths:- path:backend:serviceName: web-canary-aservicePort: 80tls:- hosts:- canary.yunweijia.comsecretName: yunweijia-tls[root@node1 canary]#[root@node1 canary]# kubectl apply -f ingress-common.yamlingress.extensions/web-canary-a created[root@node1 canary]#

[root@node1 canary]# cat ingress-weight.yaml#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: web-canary-bnamespace: canaryannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10"spec:rules:- host: canary.yunweijia.comhttp:paths:- path:backend:serviceName: web-canary-bservicePort: 80tls:- hosts:- canary.yunweijia.comsecretName: yunweijia-tls[root@node1 canary]# kubectl apply -f ingress-weight.yamlingress.extensions/web-canary-b created[root@node1 canary]#
while sleep 0.2; do curl -k https://canary.yunweijia.com/hello?name=yunweijia && echo "";done

还有一种情况是,替换完了之后并不想让其他人来访问,只想让指定的人来访问,这个时候我们如何来做呢?
可以通过控制cookie的方式来实现;
[root@node1 canary]# cat ingress-cookie.yaml#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: web-canary-bnamespace: canaryannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-cookie: "web-canary"spec:rules:- host: canary.yunweijia.comhttp:paths:- path:backend:serviceName: web-canary-bservicePort: 80[root@node1 canary]#
[root@node1 canary]# kubectl apply -f ingress-cookie.yaml



[root@node1 canary]# cat ingress-header.yaml#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: web-canary-bnamespace: canaryannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "web-canary"spec:rules:- host: canary.yunweijia.comhttp:paths:- path:backend:serviceName: web-canary-bservicePort: 80[root@node1 canary]#
[root@node1 canary]# kubectl apply -f ingress-header.yamlingress.extensions/web-canary-b created[root@node1 canary]#
curl -H "web-canary: always" -k https://canary.yunweijia.com/hello?name=yunweijia && echo ""

header > cookie > weight
#ingressapiVersion: extensions/v1beta1kind: Ingressmetadata:name: web-canary-bnamespace: canaryannotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "web-canary"nginx.ingress.kubernetes.io/canary-by-cookie: "web-canary"nginx.ingress.kubernetes.io/canary-weight: "90"spec:rules:- host: canary.yunweijia.comhttp:paths:- path: /backend:serviceName: web-canary-bservicePort: 80

往期推荐
文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




