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 導入する
- apiVersion: IngressリソースのAPIバージョンを指定
networking.k8s.io/v1
は現在の標準バージョン - kind: リソースの種類を指定します。ここでは
Ingress
です。 - 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に直接トラフィックを送ることを意味します。
- 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/