Why

なんかk8s にとっつきづらさがあるのでそれを解消したい

why? 基本的なコマンドがおぼつかないので億劫 何度も触っているはずだけど、毎日触るほどではないからコマンドが体に馴染んでない

とりあえず力こそパワー戦法が有効そう

脳筋戦法

  • kubectl コマンド叩きまくりをする

方法

https://kubernetes.io/docs/reference/kubectl/quick-reference/ まずはチートシート見る

できればカウントしてどこかに通知させたいけど、コマンド監視はセキュリティリスクが否めないので流石にやめておくか

以下実行したコマンドを羅列 (あえてhistory を使わない)

kubectl config view # kubectl を使うためのkubeconfig ファイルを修正したり確認したり

kubectl config view | fzf # 全容をみるならこれ

kubectl config view | ccat # シンタックスハイライトさせる

kubectl config view | pygmentize -O style=monokai -f console256 -g # 同じくシンタックス。。。。なんか微妙

もしかして yaml の syntax ツールあんまりいいのない?需要ありそうだけど

kubectl config --help

kubectl config current-context
arn:aws:eks:ap-northeast-1:xxxx:cluster/xxx-xxx

kubectl config get-clusters # クライアントに登録されてるクラスター一覧

kubectl config get-contexts 

kubectl config get-users # 認証用ユーザー一覧って感じ?
kubectl --help
kubectl plugin list
kubectl api-versions
kubectl api-versions | fzf # aws の namecpaces とか調べられる
kubectl get --help
kubectl describe pods -A
kubectl get pods
kubectl get pods --namespace hogehoge
kubectl logs hogehoge --namespace hogehoge
kubectl logs alb-ingress-controller-5bb5c6cbdf-4558q --namespace kube-system
kubectl logs alb-ingress-controller-5bb5c6cbdf-4558q --namespace kube-system
kubectl logs alb-ingress-controller-c456dcf7d-pplkg --namespace kube-system
kubectl apply -f alb-ingress-controller.yaml

LB Controller はアドオンで入れられるっぽい https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html

kubectl delete pod alb-ingress-controller-c456dcf7d-pplkg --namespace kube-system
kubectl get deployments -A

kubectl delete deployments alb-ingress-controller --namespace argocd
kubectl delete deployments alb-ingress-controller --namespace kube-system

150回実行。まあまあか

 history 1 | grep "kubectl" | wc -l
     156

1日1000回実行を義務にすれば一週間でまあまあ慣れそう

kubectl cluster-info
kubectl cluster-info dump
kubectl explain pods
kubectl explain serviceaccounts
kubectl api-resources
kubectl get jobs -A
No resources found
kubectl get cninodes -A
NAME                                              FEATURES
ip-xx-xx-xx-xx.ap-northeast-1.compute.internal
ip-xx-xx-xx-xx.ap-northeast-1.compute.internal

kubectl_completion いれると結構補完効くし、こっちに体を慣らしてもいいかもね。。。 あと、kだけでkubectl にする人いるし

cat <<"EOT" >> ${HOME}/.zshrc

alias k="kubectl"
complete -o default -F __start_kubectl k
EOT
kubectl get pods -A
kubectl config get-contexts
kubectl get nodes -A
NAME                                                STATUS   ROLES    AGE     VERSION
ip-xx-xx-xx-xx.ap-northeast-1.compute.internal    Ready    <none>   3h34m   v1.28.3-eks-xx
ip-xx-xx-xx-xx.ap-northeast-1.compute.internal   Ready    <none>   3h34m   v1.28.3-eks-xx
ip-xx-xx-xx-xx.ap-northeast-1.compute.internal   Ready    <none>   3h34m   v1.28.3-eks-xx
eksctl get iamidentitymapping --cluster my-cluster --region=region-code

eksctl から作成するとコンソールロールから見えなくなるので追加が必要だったね

curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/docs/eks-console-full-access.yaml
code eks-console-full-access.yaml
kubectl apply -f eks-console-full-access.yaml

eksctl get iamidentitymapping --cluster dev
eksctl create iamidentitymapping \
    --cluster dev \
    --arn arn:aws:iam::111122223333:role/my-console-viewer-role \
    --group eks-console-dashboard-full-access-group \
    --no-duplicate-arns
kubectl create namespace argocd

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

cat <<"EOT" >> ~/.zshrc

source ~/.kube-ps1/kube-ps1.sh
function get_cluster_short() {
  echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT
kubectl config set-context $(kubectl config current-context) --namespace=kube-system
kubectl config set-context $(kubectl config current-context) --namespace=argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

AWS LB Controller 導入

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json
eksctl utils associate-iam-oidc-provider --region=ap-northeast-1 --cluster=dev --approve
eksctl create iamserviceaccount \
  --cluster=dev \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --attach-policy-arn=arn:aws:iam::xx:policy/AWSLoadBalancerControllerIAMPolicy \
  --approve

ここまででサービスアカウント ここから AWS LB Controller を helm で入れる

helm delete aws-alb-ingress-controller -n kube-system
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks

Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "eks" chart repository
Update Complete. ⎈Happy Helming!⎈
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=my-cluster \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller 
kubectl get deployments -n kube-system
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           20s
coredns                        2/2     2            2           4h22m
efs-csi-controller             2/2     2            2           42m
touch argocdservice.yml
code argocdservice.yml

ArgoCD に Ingress 導入する

https://aws.amazon.com/jp/blogs/news/exposing-kubernetes-applications-part-2-aws-load-balancer-controller/

  1. apiVersion: IngressリソースのAPIバージョンを指定networking.k8s.io/v1 は現在の標準バージョン
  2. kind: リソースの種類を指定します。ここでは Ingress です。
  3. metadata: リソースに関するメタデータを指定します。
    • name: Ingressリソースの名前。
    • annotations: Ingressの動作を制御するための追加設定。
      • kubernetes.io/ingress.class: 使用するロードバランサーのタイプを指定。ここでは alb が使われています。
      • alb.ingress.kubernetes.io/scheme: ロードバランサーの種類。internet-facing はインターネットからアクセス可能なロードバランサーを指します。
      • alb.ingress.kubernetes.io/target-type: ターゲットのタイプを指定。ip はALBがPodのIPに直接トラフィックを送ることを意味します。
  4. spec: Ingressの仕様を定義します。
    • rules: トラフィックのルーティングルール。
      • host: トラフィックの対象となるホスト名。
      • http: HTTPトラフィックに関するルール。
        • paths: パスベースのルーティングルール。
          • path: ルーティングするパス。ここではルートパス (/) です。
          • pathType: パスのマッチングタイプ。Prefix は指定したパスで始まるURLにマッチします。
          • backend: トラフィックを送るバックエンドサービス。
            • service: ターゲットとなるサービスの詳細。
              • name: サービスの名前。
              • port: サービスのポート番号。

LB Controller の仕組み https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/

ClusterIP ClusterIPは複数のPodを束ねて、1つのエンドポイントを提供するサービス

kubectl apply -f argocdservice.yml
kubectl get ingress
NAME         CLASS   HOSTS   ADDRESS                                                                      PORTS   AGE
alb-argocd   alb     *       xx-xx-xx-33eb45bdc5-xx.ap-xx-xx.elb.amazonaws.com   80      58s
kubectl describe deployment argocd-server
kubectl get svc
NAME                                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
argocd-applicationset-controller          ClusterIP   10.100.227.219   <none>        7000/TCP,8080/TCP            5h11m
argocd-dex-server                         ClusterIP   10.100.93.229    <none>        5556/TCP,5557/TCP,5558/TCP   5h11m
argocd-metrics                            ClusterIP   10.100.154.197   <none>        8082/TCP                     5h11m
argocd-notifications-controller-metrics   ClusterIP   10.100.50.226    <none>        9001/TCP                     5h11m
argocd-redis                              ClusterIP   10.100.168.221   <none>        6379/TCP                     5h11m
argocd-repo-server                        ClusterIP   10.100.224.95    <none>        8081/TCP,8084/TCP            5h11m
argocd-server                             ClusterIP   10.100.35.30     <none>        80/TCP,443/TCP               5h11m
argocd-server-metrics                     ClusterIP   10.100.101.129   <none>        8083/TCP                     5h11m
argocd-server                             ClusterIP   10.100.35.30     <none>        80/TCP,443/TCP               5h11m
kubectl get pods

あ〜バックエンドが https でって指定してる可能性あるな

curl http://hoge.ap-northeast-1.elb.amazonaws.com/
<a href="hoge/">Temporary Redirect</a>.
curl http://xxx.ap-northeast-1.elb.amazonaws.com/ -v
dig argocdk8s.hoge.hoge.hoge.hoge

https://nobelabo.hatenablog.com/entry/2022/10/01/201138

kubectl get svc argocd-server -o yaml

リダイレクトループの原因となるリダイレクト設定が入ってそう

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"server","app.kubernetes.io/name":"argocd-server","app.kubernetes.io/part-of":"argocd"},"name":"argocd-server","namespace":"argocd"},"spec":{"ports":[{"name":"http","port":80,"protocol":"TCP","targetPort":8080},{"name":"https","port":443,"protocol":"TCP","targetPort":8080}],"selector":{"app.kubernetes.io/name":"argocd-server"}}}
  creationTimestamp: "2023-12-23T09:47:03Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
  name: argocd-server
  namespace: argocd
  resourceVersion: "40378"
  uid: edd5aa6f-7ded-40b6-9c51-a465f736b681
spec:
  clusterIP: 10.100.35.30
  clusterIPs:
  - 10.100.35.30
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: https
    port: 443
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/name: argocd-server
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

https://github.com/argoproj/argo-cd/issues/12195

なんかissueっぽい https://github.com/argoproj/argo-cd/issues/12195

kubectl get svc argocd-server -o yaml
kubectl get configmap
kubectl describe configmap argocd-cmd-params-cm
kubectl get configmap argocd-cmd-params-cm -o yaml
kubectl get configmap argocd-cmd-params-cm -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-cmd-params-cm","app.kubernetes.io/part-of":"argocd"},"name":"argocd-cmd-params-cm","namespace":"argocd"}}
  creationTimestamp: "2023-12-23T09:47:01Z"
  labels:
    app.kubernetes.io/name: argocd-cmd-params-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-cmd-params-cm
  namespace: argocd
  resourceVersion: "40343"
  uid: 9f088819-41c7-4ccf-bcb9-ebe62a1d42ba
kubectl wait deploy/argocd-server -n argocd --for condition=available --timeout=600s

これしかない https://techstep.hatenablog.com/entry/2020/11/15/121503 insecuremodeで起動が必要 マニフェストから変えないとダメそう

curl https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -o install.yaml

中身見る 21676 行目から。以下の部分が多分そう

        - name: ARGOCD_SERVER_INSECURE
          valueFrom:
            configMapKeyRef:
              key: server.insecure
              name: argocd-cmd-params-cm
              optional: true
      - args:
        - /usr/local/bin/argocd-server
        env:
        - name: ARGOCD_SERVER_INSECURE
          valueFrom:
            configMapKeyRef:
              key: server.insecure
              name: argocd-cmd-params-cm
              optional: true

ConfigMap からデータとってきてる

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/name: argocd-cmd-params-cm
    app.kubernetes.io/part-of: argocd
  name: argocd-cmd-params-cm
kubectl apply -n argocd -f install.yaml
kubectl get deployments
kubectl rollout restart deploy argocd-server

いけた〜〜〜

kubectl -n argocd get secret/argocd-initial-admin-secret
kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
k -n argocd describe secret/argocd-initial-admin-secret

バイト数しか出ない。シークレットの取得は?

k get secrets

確かに、このクラスターから他クラスターへ Deploy するのが良さそうではある

kubectl get services

external ip ついてると node の ip で受け付ける

いっこいっこコンポーネント見ていく

kube-proxy

k get daemonsets
kube-proxy

Node あたり一つ実行される

  • Image: 602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/kube-proxy:v1.28.1-minimal-eksbuild.1
  • config=/var/lib/kube-proxy-config/config Mounts: /lib/modules from lib-modules (ro) /run/xtables.lock from xtables-lock (rw) /var/lib/kube-proxy-config/ from config (rw) /var/lib/kube-proxy/ from kubeconfig (rw) /var/log from varlog (rw)

めちゃ多い

k get configmaps
k describe configmap kube-proxy

Data

  • ca / server 情報 / token の情報
k describe configmap kube-proxy-config

設定みてもよくわからんやつが多い

mode: “iptables”

https://github.com/kubernetes/kube-proxy https://www.kimullaa.com/posts/202003082356/ 各ノードで動作するネットワークプロキシ。Service の仕組みの一部(ClusterIP や NodePort など)を実現し、クラスタ内部または外部から Pod にアクセスできるように制御

![[Pasted image 20231224202548.png]] kube-api-server をpolling している?そこの変更を受け取って情報登録したりするっぽく見える

  • iptablesのルールを管理するのがkube-proxyらしい
k create namespace dev
k apply -f test.yml

echo server は container port 8080 で受付 service は port 8081で受け付けて target port 8080 へ流す

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echoserver
  template:
    metadata:
      labels:
        app: echoserver
    spec:
      containers:
      - image: gcr.io/google_containers/echoserver:1.9
        imagePullPolicy: Always
        name: echoserver
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: echoserver
  namespace: dev
spec:
  type: NodePort
  selector:
    app: echoserver
  ports:
    - protocol: TCP
      port: 8081
      targetPort: 8080
k describe node xxx
Addresses:
  InternalIP:   xx
  ExternalIP:   xxx

nodeport -> port -> targetport == containerport

curl xxx:xx

Hostname: echoserver-775df6fcdd-zw27s

Pod Information:
	-no pod information available-

あとは ssh できる deployment を導入して中身を調べる

loginする

kubectl exec -it <Pod名> /bin/bash
k exec -it echoserver-775df6fcdd-zw27s /bin/bash
cat hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
192.168.33.43	echoserver-775df6fcdd-zw27s
apt update
apt install iproute2 -y
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default
    link/ether a2:2b:86:6e:7e:af brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.33.43/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a02b:86ff:fe6e:7eaf/64 scope link
       valid_lft forever preferred_lft forever
apt -y install net-tools
k exec -it argocd-server-65884855cf-n69l5 /bin/bash -n argocd
k get events -n argocd
k debug -it echoserver-775df6fcdd-zw27s --image=busybox
k get endpoints -A
k get sa -A
k get rolebindings -A
k get roles -A

kubecost 導入

https://www.kubecost.com/products/self-hosted https://docs.kubecost.com/install-and-configure/install

helm upgrade --install kubecost \
  --repo https://kubecost.github.io/cost-analyzer/ cost-analyzer \
  --namespace kubecost --create-namespace
kubectl get svc -A
kubecost            kubecost-cost-analyzer                            ClusterIP
kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090
running PreBind plugin “VolumeBinding”: binding volumes: timed out waiting for the condition
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
k top nodes
NAME                                                CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
ip-192-168-27-29.ap-northeast-1.compute.internal    545m         28%    923Mi           13%
ip-192-168-38-224.ap-northeast-1.compute.internal   543m         28%    931Mi           13%
ip-192-168-54-172.ap-northeast-1.compute.internal   555m         28%    1166Mi          16%

kubecost-prometheus-server pending… https://github.com/AjayTripathy/kubecost-quickstart/issues/2 これっぽいな

CrashLoopBackOff トラブルシュート →GpTに聞くのが良さそう

k get apiservices

めっちゃあるな v1 v1alpha v1beta v1beta1 v1beta2 v2

kubectl get all
kubectl get po,svc,rs,deploy

agones

k get namespaces
kubectl create namespace agones-system
kubectl apply --server-side -f https://raw.githubusercontent.com/googleforgames/agones/release-1.37.0/install/yaml/install.yaml

導入はすぐ https://agones.dev/site/docs/getting-started/create-gameserver/