Today I Learn - 49


Session Affinity
固定セッションによってクライアントが常に同じWeb/アプリケーション/ファイルにアクセスできるようにする技術.
サービス-ロードバランサの設定
クベルネディスにアクセスするノードを設定する必要がありますが、クベルネディス内では設定できませんので、追加のインストールが必要です.
あの
MELTAL LB
2段目ダンボール
layer 2で働きます.Arpリクエストおよびipv 4サービス、NDPリクエストおよびIPv 6サービス.
イーサネットさえあれば仕事ができます.ルーターは不要です.
技術的な欠点:負荷バランサを1つのノードにインストールするため、要求が多すぎるとパフォーマンスが低下する可能性があります.
BGPモード
実際には物理ルータが必要です.
Service - External Name
参照外部はKubednsに設定されています.CNAMEからなる.
アプリケーション-->SVC(ギャップ)-->api.google.com/monitoring/v5
Service - Endpoint
デフォルトでは、サービス名と同じ名前のオブジェクトが自動的に作成されます.
ラベルコレクタによって選択されたシードのリストがあります.
Service - Ingress
Service
プロキシ、ロードバランサ
  • クラスタIP:クボニスクラスタの内部にある<>内部
  • NodePort:クバーネディスクラスタ外部露出->内部
  • LoadBarancer:クバーネディスクラスタ外部露出->内部
  • 外部Name:クボニスクラスタ内->外部
  • ClusterIP
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc
    spec:
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80 # 서비스 포트
          targetPort: 8080 # Pod의 노출 포트
    kubectl run test -it --image ghcr.io/c1t1d0s7/network-multitool --rm
    
    > host myapp-svc.default.svc.cluster.local
    > host myapp-svc.default.svc
    > host myapp-svc.default
    > host myapp-svc
    FQDN
    <SVC_NAME>.<NAMESPACE>.<RESOURCE_TYPE>.<DOMAIN>
  • RESOURCE_TYPE: svc
  • DOMAIN: cluster.local
  • サービス-マルチポート
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc
    spec:
      selector:
        app: myapp
      ports:
        - name: http
          protocol: TCP
          port: 80
          targetPort: 8080
        - name: https
          protocol: TCP
          port: 443
          targetPort: 8443
    サービス-セッション依存性
    固定クライアント上のセッション
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc-ses
    spec:
      sessionAffinity: ClientIP
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    /etc/resolv.conf
    nameserver 169.254.25.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • nameserver:DNSサーバ
  • 169.254.25.10 -> (nodelocaldns : DNS Cache Server)
  • Client -> nodelocaldns -> coredns
  • nodeocaldnsが構成されていない場合は、kube-systemでcorednsサービスのIP設定
  • を構成します.
    Service - Headless Service
    シードのIPを復元
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc-headless
    spec:
      clusterIP: None
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    host myapp-svc-headless
    myapp-svc-headless.default.svc.cluster.local has address 10.233.84.68
    myapp-svc-headless.default.svc.cluster.local has address 10.233.120.26
    myapp-svc-headless.default.svc.cluster.local has address 10.233.94.45
    StatefulSetコントローラとHeadless Serviceを併用します.
    各シードにFQDNを付与
    Service - NodePort
    30000-32767
    ClusterIP + NodePort
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc-nodeport
    spec:
      type: NodePort
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    その他のMetalb構成
    https://metallb.universe.tf/
    Metalb操作モード

  • 階層2:階層2 Ethrenetネットワークのみが正常に動作する(ルータX)

  • BGP:ルータが必要
  • vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/addons.yml
    metallb_enabled: true
    metallb_ip_range:
      - "192.168.201.200-192.168.201.220"
    metallb_protocol: "layer2"
    vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.ym
    kube_proxy_strict_arp: true
    ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
    kubectl get ns
    kubectl get all -n metallb-system
    Service - LoadBalancer
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc-lb
    spec:
      type: LoadBalancer
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    Service - ExternalName
    アプリケーション-->SVC(ギャップ)-->api.google.com/monitoring/v5
    apiVersion: v1
    kind: Service
    metadata:
      name: gping
    spec:
      type: ExternalName
      externalName: www.google.com
    
    # gping.default.svc.cluster.local
    # -CNAME-> www.google.com
    Service - Endpoint
    デフォルトでは、サービス名と同じ名前のオブジェクトが自動的に作成されます.
    ラベルコレクタによって選択されたシードのリストがあります.
    Ingress
    https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/
    Nginx Ingress Controlのインストール
    vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/addons.yml
    ingress_nginx_enabled: true
    ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
    kubectl get ns
    kubectl get all -n ingress-nginx
    リソースのインポート
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: myapp-ing
    spec:
      rules:
      #http://www.example.com -> myapp-svc:80
      - host: www.example.com
        http:
          paths:
          - path: / 
            backend:
              serviceName: myapp-svc
              servicePort: 80
    ### a.exam.com
    ### b.exam.com
    ### c.exam.com/help
    ### c.exam.com/qna
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-svc
    spec:
      selector:
        app: myapp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: myapp-rs
      labels:
        app: myapp
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: ghcr.io/c1t1d0s7/go-myweb
            ports:
            - containerPort: 8080
    テストのインポート
    方法1:/etc/hosts変更
    192.168.201.21 www.example.com
    C:\Windows\System32\drivers\etc\hosts
    方法2:curl-resolv
    curl http://www.example.com --resolv www.example.com:80:192.168.201.23 -v
    4/27作業
    MySQLクライアントツールによるMySQLデータベースへのサービスの作成
    apiVersion: v1
    kind: Pod
    metadata:
      name: mysql-pod
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: qwer1234
        ports:
        - containerPort: 3306
          protocol: TCP
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
    spec:
      selector:
        app: mysql
      ports:
        - protocol: TCP
          port: 3306
          targetPort: 3306
    kubectl run test -it --image ghcr.io/c1t1d0s7/network-multitool --rm