K8S는 고 가용성 침투를 배포

입구 배포 고 가용성을

공식 웹 사이트 주소 https://kubernetes.github.io/ingress-nginx/deploy/

진입 안무 파일을 가져옵니다

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

노드 레이블을 추가

kubectl label node k8snode1 ingresscontroller=true
kubectl get nodes --show-labels

첨부 파일 :

  • 제거 라벨
    kubectl label node k8snode1 ingresscontroller-
  • 업데이트 라벨
    kubectl label node k8snode1 ingresscontroller=false --overwrite

1, 배포가 DaemonSet이며, 수정, 복사 매수를 주석

kind: DaemonSet
  #replicas: 1

2, hostNetwork 네트워크를 활성화하고 지정된 노드를 실행

관련 기업,이 노드의 호스트 노드,이 응용 프로그램이 포트를 통해 액세스 할 수있는 네트워크의 다른 호스트의 호스트에 진입-의 nginx 컨트롤러 포트의 hostNetwork 노출.

Ingresscontroller은 = 사실 태그가 추가 된 지정된 노드 nodeSelector 이전

      hostNetwork: true
      nodeSelector:
        ingresscontroller: 'true'

3 미러 주소 변경
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.24.1

(4) 변형 된 컨테이너 항구

          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --http-port=88 #默认80
            - --https-port=4433 #默认443
            
            
          ports:
            - name: http
              containerPort: 88 #更改为88
            - name: https
              containerPort: 4433 #更改为4433

5, 마스터 노드의 내성을 증가

      tolerations: #增加容忍,可分配到master节点
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

도 6은 다음 mandatory.yaml
vim mandatory.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nginx-ingress-serviceaccount
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"
    resources:
      - ingresses/status
    verbs:
      - update

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      # Defaults to "<election-id>-<ingress-class>"
      # Here: "<ingress-controller-leader>-<nginx>"
      # This has to be adapted if you change either parameter
      # when launching the nginx-ingress-controller.
      - "ingress-controller-leader-nginx"
    verbs:
      - get
      - update
  - apiGroups:
      - ""
    resources:
      - configmaps
    verbs:
      - create
  - apiGroups:
      - ""
    resources:
      - endpoints
    verbs:
      - get
      
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: nginx-ingress-role-nisa-binding
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nginx-ingress-role
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-nisa-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

---

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      hostNetwork: true
      nodeSelector:
        ingresscontroller: 'true'
      tolerations: #增加容忍,可分配到master节点
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
        - name: nginx-ingress-controller
          image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.24.1
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
            - --http-port=88 #默认80
            - --https-port=4433 #默认443
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 33
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 88 #更改为88
            - name: https
              containerPort: 4433 #更改为4433
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown

테스트

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-static
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-static
  labels:
    name: nginx-static
spec:
  replicas: 1
  template:
    metadata:
      labels:
       name: nginx-static
    spec:
      containers:
       - name: nginx-static
         image: nginx:latest
         volumeMounts:
          - mountPath: /etc/localtime
            name: vol-localtime
            readOnly: true

         ports:
          - containerPort: 80
      volumes:
         - name: vol-localtime
           hostPath:
            path: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-static
  labels:
   name: nginx-static
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  selector:
    name: nginx-static

--- 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: submodule-checker-ingress
spec:
  rules:
  - host: nginx.weave.pub
    http:
      paths:
      - backend:
          serviceName: nginx-static
          servicePort: 80

kubectl create -f nginx-static.yaml

액세스

vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.x.x.x master1 nginx.test.pub
10.x.x.x master2
[root@master1 ingress]# curl nginx.test.pub
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

1.1 그레스 프로필

1.1.1 수요

  외부 서비스가 필요가 해당 NodeIP에 액세스 할 경우 coredns 액세스에 도메인 이름 포드, 필요 사이의 서비스를 달성 : 포트. 서비스가 증가 그러나, 일단 호스트 포트를 지정 NodePort 필요로 인해, 더 많은 포트를 관리하기 어려울 것이다. 그래서,이 경우, 침투가 더 적절한 서비스를 노출 사용합니다.

1.1.2 침투 구성 요소 설명

  리버스 프록시 부하 분산, 침투 침투 컨트롤러 : 침투 사용은 일반적으로 세 가지 구성 요소가

1 리버스 프록시로드 밸런서

  그것은 nginx를 의미 프록시 부하 분산은 매우 간단 아파치 미들웨어 역, 새로운 K8S 때문에 별도의 배포 Nginx에, 당신은 침투 컨트롤러를 배포 할 필요가 없습니다, 하나 개의 구성 요소에 침투 컨트롤러와 Nginx에 있습니다. 리버스 프록시 부하 분산을 자유롭게 클러스터에 배포 할 수 있습니다, 당신은 길에 이렇게 복제 컨트롤러, 배포, DaemonSet을 사용할 수 있습니다

2 그레스 컨트롤러

  침투 컨트롤러는 기본적으로 지속적 등는 Kubernetes의 API, 실시간 인식 백엔드 서비스 변경 포드, 같은 추가 등과 포드, 서비스 및 기타 증가와 감소를 줄이기 처리하여 모니터, 침투 컨트롤러로 이해 될,이 변경 정보를 얻을 때 이후, 제어부 그레스 그레스 재조합은 다음과 같은 구성을 생성하고 리버스 프록시 부하 분산을 갱신하고, 상기 서비스 디스커버리의 역할에 그 구성을 새로

3 그레스

  침투는 상기 정의 된 규칙을 이해하는 간단한 예를 들어, 도메인 이름 서비스 전달 즉 서비스에 대응하는 경우의 도메인에 대한 요청을 상기 인 그레스 컨트롤러 바인딩이 규칙, 그것의 컨트롤러 그레스 동적 쓰기 전체 서비스 검색 및로드 밸런싱을 달성하기 위해 밸런서 구성을로드

아래와 같이 전체적으로 관계 :

  당신은 명확하게 위의 이미지에서 볼 수있는, 요청이 실제로 어떤 서비스로, 그 서비스를 통해 도메인 이름의 대응과 그 상호 작용을 통해 다음 침투 침투 컨트롤러는 API는 Kubernetes와 상호 작용하는 등의 nginx로 들어왔다 또는 부하 분산 차단되었습니다 어드레스 및 다른 정보는, 서비스 디스커버리, 즉 동적 맵핑을 달성 할 수있는 규칙을 다시 다음 실시간 부하 분산 장치, 부하 분산 후 작성된 포괄적 프로파일을 생성한다.

3.1.3 Nginx에-침투 작품

  인식 유입 클러스터 대화 형, 동적 규칙 변경을 통해 유입 컨트롤러와는 Kubernetes API를 한 다음 nginx- 쓴 다음, 사용자 정의 규칙의 규정에 따라, 그것을 읽고 몇 가지의 nginx 구성을 생성하고 해당 도메인 이름 서비스의 어떤 진술된다 구성을 검증하는 데 다시 다음과, 실행중인 Nginx의 서비스에서 포드의 유입 컨트롤러, 컨트롤러가 쓰기 /etc/nginx.conf의 nginx 구성 파일을 생성 곳의 포드 유입 제어. 동적 구성 갱신 서브 도메인 이름을 달성하기 위해서.

설명 : 다른 개발 회사를 기반으로 유입 컨트롤러의 nginx 서비스를 기반으로는,으로 나누어 져 있습니다 :

  • K8S 사회 앵그르 - nginx를 (https://github.com/kubernetes/ingress-nginx)
  • 의 nginx의 nginx를-유입 (https://github.com/nginxinc/kubernetes-ingress)

3.2.4 침투 컨트롤러 고 가용성 아키텍처

  클러스터 교통 액세스 레이어로, 침투 컨트롤러의 고 가용성이 특히 중요, 고 가용성, 우리는 첫 번째 문제는 실패의 단일 지점입니다 해결할 수 있어야합니다, 일반적으로 사용되는 방법은, 우리가 고 가용성 침투 컨트롤러 클러스터는 Kubernetes 연결 배포 배포의 복사본을 여러 개 사용하는 것입니다 비즈니스 애플리케이션과 서비스 자원에 대한 침투 경쟁의 발생을 방지하기 위해 클러스터 교통 액세스 포트, 전용 입구 노드의 제안 방식으로, 때문에 침투의 다중 노드 배포 아키텍처의 동일 층에.

  트래픽의 후단 용량 입구 노드의 스케일링 레벨에 기초하는 동안, 인 그레스는 입구 유동 통합 액세스 계층 전용 캐리어 클러스터 인스턴스의 복수의 상기 한 바와 같이,도 배포 아키텍처. 클러스터 크기가 큰 초기가 아닌 경우 물론, 그것은 또한 방법으로 침투 서비스 응용 프로그램 믹스와 사업 부서를 사용하지만, 자원 제약과 격리를 추천 할 수있다.

추천

출처www.cnblogs.com/keep-live/p/11882829.html