二進制部署K8S集群(二十二)addons之安裝部署ingress


1.說明

對於Kubernetes的service,無論是cluster-ip和nodeport均是四層的負載,集群內的服務如何實現七層的負載均衡,這就需要借助於ingress,ingress控制器實現的方式有很多,比如nginx,contour,haproxy,trafik,lstio。幾種常用的ingress功能對比和選型可以參考這里www.kubernetes.org.cn/5948.html

ingress-nginx是七層的負載均衡器,負責統一管理外部對k8s cluster中的service的請求。主要包含:

  • ingress-nginx-controller:要據用戶編寫的ingress規則(創建的Ingress的yaml文件),動態的去更改服務的配置文件,並且reload重載使其生效(是自動化的,通過Lua腳本來實現);
  • ingress資源對象:將Nginx的配置抽像成一個Ingress對象
  • ingress是K8S的標准資源類型之一,也是一種核心資源,它其實就是一種基於域名和URL路徑,把用戶的請求轉發至指定Service資源的規則。可以將集群外部的請求流量,轉發至集群內部,從而實現“服務暴露”
  • ingress控制器是能夠為Ingress資源監聽某套接字,然后根擾Ingress規則匹配機制路由調度流量的一個組件。
    參考鏈接:https://github.com/nginxinc/kubernetes-ingress

總結用ingress好處:

  • 同台服務器不同業務不需要再給每個業務映射端口(Nodeport),只需要每台機安裝一個ingress,利用ingress反代CluserIP,前端機訪問Ingress固定端口
  • 添加新業務只需要再創建一個ingress反代新業務的service,再去前端Nginx反代配置servername里面添加一個域名即可以訪問新業務,通過不同的域名訪問不同的業務,不需要再配反代

2.業務架構圖

3.Ingress訪問流程圖

4.架構

主機 角色 IP 節點
hdss7-21.host.com ingress,nginx 10.4.7.21 node
hdss7-22.host.com ingress,nginx 10.4.7.22 node
hdss7-11.host.com dns,nginx七層反代 10.4.7.11 負載均衡機(proxy),dns服務器
hdss7-12.host.com nginx七層反代 10.4.7.12 負載均衡機(proxy)
hdss7-200.host.com 資源配置清單 10.4.7.200 運維主機

5.部署traefik

5.1 准備traefik鏡像

hdss7-200機主機上操作:

docker pull traefik:v1.7-alpine
docker tag c36f69007d98 harbor.od.com/k8s/traefik:v1.7
docker push harbor.od.com/k8s/traefik:v1.7
5.2 准備traefik資源配置清單目錄

清單下載地址:https://github.com/traefik/traefik/tree/v1.7/examples/k8s

mkdir -p /data/k8s-yaml/traefik && cd /data/k8s-yaml/traefik
5.3 准備rbac.yaml文件
cat > /data/k8s-yaml/traefik/rbac.yaml <<'eof'
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system
eof
5.4 准備daemonset.yaml文件
cat > /data/k8s-yaml/traefik/daemonset.yaml <<'eof'
apiVersion: apps/v1
kind: DaemonSet
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
      containers:
      - image: harbor.od.com/k8s/traefik:v1.7
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
          hostPort: 81
			  - name: web-admin
          containerPort: 8080
          hostPort: 8081
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://10.4.7.10:7443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus
      imagePullSecrets:
      - name: harbor
eof

hostPort: 81 為ingress的程序80端口映射到宿主機供提供訪問的端口

5.5 安裝ingress
kubectl apply -f http://k8s-yaml.od.com/traefik/rbac.yaml 
kubectl apply -f http://k8s-yaml.od.com/traefik/daemonset.yaml 

6.創建nginx資源清單目錄

mkdir /data/k8s-yaml/nginxtest

7.創建ingress.yml

cat > /data/k8s-yaml/nginxtest/ingress.yml <<'eof'
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-web
  namespace: default
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: nginxtest.od.com
    http:
      paths:
        - path: /
          backend:
            serviceName: nginx-test
            servicePort: 80
eof

主機名為nginxtest.od.com,反代到svc的name為nginx-test,路徑為/,端口80

8.創建svc.yml

cat > /data/k8s-yaml/nginxtest/svc.yml <<'eof'
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: nginx-test
  name: nginx-test
  namespace: default
spec:
  ports:
    - port: 80
      protocol: TCP
  selector:
    app: nginx-test
  sessionAffinity: None
eof

svc標簽選擇器app: nginx-test,反代pod為app:nginx-test

9.創建deploy.yml

cat > /data/k8s-yaml/nginxtest/deploy.yml <<'eof'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  labels:
    app: nginx-test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-test
        image: harbor.od.com/public/nginx:v1.7.9
        ports:
        - name: web
          containerPort: 80

10.添加dns解析

hdss7-11.host.com上操作

cat >> /var/named/od.com.zone <<'eof'
nginxtest          A    10.4.7.10
eof
vi /var/named/od.com.zone
2020100504  ; serial # 日期加1
systemctl restart named

11.配置7層負載

在hdss7-11.host.com和hdss7-12.host.com上操作

cat >/etc/nginx/conf.d/nginxtest.com.conf <<'eof'
upstream default_backend_traefik {
    server 10.4.7.21:81    max_fails=3 fail_timeout=10s;
    server 10.4.7.22:81    max_fails=3 fail_timeout=10s;
}
server {
    server_name nginxtest.od.com;
  
    location / {
        proxy_pass http://default_backend_traefik;
        proxy_set_header Host       $http_host;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }
}
eof
nginx -s reload

12.應用資源配置清單

以下都在hdss7-21.host.com或hdss7-22上操作:

[root@hdss7-22 ~]# kubectl apply -f http://k8s-yaml.od.com/nginxtest/deploy.yml
[root@hdss7-22 ~]# kubectl apply -f http://k8s-yaml.od.com/nginxtest/svc.yml
[root@hdss7-22 ~]# kubectl apply -f http://k8s-yaml.od.com/nginxtest/ingress.yml
[root@hdss7-22 ~]# kubectl get ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME        CLASS    HOSTS              ADDRESS   PORTS   AGE
nginx-web   <none>   nginxtest.od.com             80      18h
[root@hdss7-22 ~]# kubectl get pods -n kube-system -o wide           
NAME                               READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
coredns-57c78bdbcd-lsf5z           1/1     Running   4          30h   172.7.21.3   hdss7-21.host.com   <none>           <none>
traefik-ingress-controller-9n8zb   1/1     Running   0          11h   172.7.21.5   hdss7-21.host.com   <none>           <none>
traefik-ingress-controller-wxnqw   1/1     Running   0          11h   172.7.22.4   hdss7-22.host.com   <none>           <none>

13.修改html

[root@hdss7-22 ~]# kubectl get pods -o wide                          
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
nginx-test-558df79dc9-d95rp   1/1     Running   0          9h    172.7.21.2   hdss7-21.host.com   <none>           <none>
nginx-test-558df79dc9-qw2fj   1/1     Running   0          9h    172.7.22.2   hdss7-22.host.com   <none>           <none>
[root@hdss7-22 ~]# kubectl exec -it nginx-test-558df79dc9-d95rp -- /bin/bash
root@nginx-test-558df79dc9-d95rp:/# echo WEB1 > /usr/share/nginx/html/index.html
root@nginx-test-558df79dc9-d95rp:/# exit
exit
[root@hdss7-22 ~]# kubectl exec -it nginx-test-558df79dc9-qw2fj -- /bin/bash     
root@nginx-test-558df79dc9-qw2fj:/# echo WEB2 > /usr/share/nginx/html/index.html

14.WEB訪問


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM