1 理解Ingress
2 理解Ingress Controller
3 RBAC
在 RBAC API 的四個重要概念:
4 部署traefik
$ cat ingress-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: ingress namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: ingress subjects: - kind: ServiceAccount name: ingress namespace: kube-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
4.2 創建DaemonSet
4.2.1 創建節點標簽
kubectl label nodes 172.19.8.114 edgenode=true kubectl label nodes 172.19.8.115 edgenode=true
4.2.2 部署traefik-ingress-controller.yml
apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: traefik-ingress-lb namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: terminationGracePeriodSeconds: 60 hostNetwork: true restartPolicy: Always serviceAccountName: ingress containers: - image: traefik name: traefik-ingress-lb resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 hostPort: 8080 args: - --web - --web.address=:8080 - --kubernetes - --insecureskipverify nodeSelector: edgenode: "true"
4.3 配置traefik UI
$ cat ui.yaml apiVersion: v1 kind: Service metadata: name: traefik-web-ui namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - name: web port: 80 targetPort: 8580 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system spec: rules: - host: traefikui.test.com http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web
配置完成后就可以啟動treafik ui ingress了。
4.3.1 訪問測試
5 配置traefik支持https
5.1 https介紹
client --- (via https) ---> traefik ---- (via http) ----> services
2、 client與traefik間采用https加密通信,但traefik與svc也是采用https通信
client --- (via https) ---> traefik ---- (via https) ----> services
5.2 配置證書
# mkdir /etc/kubernetes/ssl/ # cd /etc/kubernetes/ssl/ # 將證書存放在此目錄 # ls pt1.20201216.key pt1.20201216.pem
5.3 創建secret,保存https證書,注意操作目錄,如果不是在此目錄下操作,須指定絕對路徑,同時配置traefik多域名證書形式,traefik能夠自動識別證書
[root@node-01 ssl]# kubectl create secret generic traefik-cert --from-file=/etc/kubernetes/ssl/pt1.20201216.key --from-file=/etc/kubernetes/ssl/pt1.20201216.pem
--from-file=/etc/kubernetes/ssl/pt2.20201216.key --from-file=/etc/kubernetes/ssl/pt2.20201216.pem
-n kube-system
5.4 創建configmap,保存traefik配置
說明:此處兩種配置方式,1.所有http請求全部rewrite為https。2.區分http和https兩種請求。此處使用第二種
# 1.所有http請求全部rewrite為https [root@node-01 traefik]# cat traefik.toml defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/etc/kubernetes/ssl/pt1.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt1.20201216.key"
[[entryPoints.https.tls.certificates]]
certFile = "/etc/kubernetes/ssl/pt2.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt2.20201216.key"
# 2.區分http和https兩種請求 [root@node-01 traefik]# cat traefik.toml defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/etc/kubernetes/ssl/pt1.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt1.20201216.key"
[[entryPoints.https.tls.certificates]]
certFile = "/etc/kubernetes/ssl/pt2.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt2.20201216.key"
[root@node-01 traefik]# kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system
查看創建的configmap
[root@node-01 traefik]# kubectl get configmap traefik-conf -o yaml -n kube-system apiVersion: v1 data: traefik.toml: | defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/etc/kubernetes/ssl/pt1.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt1.20201216.key"
[[entryPoints.https.tls.certificates]]
certFile = "/etc/kubernetes/ssl/pt2.20201216.pem" keyFile = "/etc/kubernetes/ssl/pt2.20201216.key"
kind: ConfigMap metadata: creationTimestamp: "2019-05-07T11:31:07Z" name: traefik-conf namespace: kube-system resourceVersion: "222740" selfLink: /api/v1/namespaces/kube-system/configmaps/traefik-conf uid: 9b315499-70bb-11e9-9a10-fa0caed1a100
5.5 部署traefik,這里主要是要關聯創建的secret和configmap,並掛載到pod中的目錄。
5.5.1 為主機打標簽,確定traefik部署在哪些node上面
kubectl label nodes 172.19.8.114 edgenode=true kubectl label nodes 172.19.8.115 edgenode=true
5.5.2 由於k8s啟用了rbac,因此需要創建權限
[root@node-01 traefik]# cat ingress-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
我們使用DaemonSet類型來部署Traefik,並使用nodeSelector來限定Traefik所部署的主機。
[root@node-01 traefik]# cat traefik-deployment.yaml kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 hostNetwork: true volumes: - name: ssl secret: secretName: traefik-cert - name: config configMap: name: traefik-conf containers: - image: traefik name: traefik-ingress-lb volumeMounts: - mountPath: "/etc/kubernetes/ssl" name: "ssl" - mountPath: "/config" name: "config" resources: limits: cpu: 200m memory: 300Mi requests: cpu: 100m memory: 200Mi ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 hostPort: 8080 args: - --api - --kubernetes - --configfile=/config/traefik.toml - --insecureskipverify nodeSelector: edgenode: "true" #指定部署traefik的主機標簽 --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 443 name: https - protocol: TCP port: 8080 name: admin --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system spec: rules: - host: traefikui.test.com http: paths: - path: / backend: serviceName: traefik-ingress-service servicePort: admin
volumes用來引用創建的secret和configmap,volumeMounts 指定將引用的secret和configmap掛載到什么位置。
5.5.3 檢查創建的traefik ui
[root@node-01 traefik]# kubectl get pods -A |grep trae kube-system traefik-ingress-controller-6q7hx 1/1 Running 0 14h kube-system traefik-ingress-controller-wgr7d 1/1 Running 0 14h
[root@node-01 traefik]# kubectl logs -f traefik-ingress-controller-wgr7d -n kube-system
6 實戰小測
[root@node-01 testnginx]# cat test-nginx.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-nginx spec: replicas: 1 template: metadata: labels: app: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 443 --- apiVersion: v1 kind: Service metadata: name: my-nginx labels: app: my-nginx spec: ports: - port: 80 protocol: TCP selector: app: my-nginx --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-nginx spec: rules: - host: test.test.com http: paths: - backend: serviceName: my-nginx servicePort: 80 path: / tls: - hosts: - test.test.com
[root@node-01 ~]# cat kubernetes-dashboard-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kube-ui namespace: kube-system spec: rules: - host: k8sui.ptengine.jp http: paths: - path: '/' backend: serviceName: kubernetes-dashboard servicePort: 443