## K8S筆記 ### 在k8s建立pods,第一次輸入視為create,之後info會提示是否update docker run -t kubectl apply -f <file name or directory> ==kubectl apply -f pod.yaml== ### 列出pod列表 kubectl get pods ### 列出所有列表 kubectl get all ### 將本地端口轉發到k8s集群端口 kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT ==kubectl port-forward pod/auth-service 8080:80== ### 修改config後apply,查看更新狀況,一直沒成功會time out kubectl rollout status deployment auth-service-deployment ### 重啟pod kubectl rollout restart deployment <deployment_name> -n <namespace> ### 服務有異常,回滾至上個版本 kubectl rollout undo deployment auth-service-deployment --record ### 回滾至指定版本 kubectl rollout undo deployment auth-service-deployment --to-revision=1 --record ### 列出所有port-forward process ps -ef|grep port-forward ### 停止監聽process kill -9 <process number> ### 進入容器 kubectl exec -it POD_NAME -- sh ### 刪除namespace底下的所有容器 kubectl delete ns NAME_SPACE :::info ### 下載dashboard kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml ### 開啟API Server kubectl proxy ### 生成token kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kube-system-default labels: k8s-app: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: default namespace: kube-system --- apiVersion: v1 kind: Secret metadata: name: default namespace: kube-system labels: k8s-app: kube-system annotations: kubernetes.io/service-account.name: default type: kubernetes.io/service-account-token EOF 打印token TOKEN=$(kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}') kubectl config set-credentials docker-desktop --token="${TOKEN}" echo $TOKEN ::: ## 透過Ingress實現nginx ### 透過.yaml安裝 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.1/deploy/static/provider/cloud/deploy.yaml ### 範例 ```yaml! apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: ingressClassName: nginx defaultBackend: <!-- 在沒有規定其他port號下,預設會導向odin-service的8000port --> service: name: odin-service port: number: 8000 ``` ```yaml! apiVersion: v1 kind: Service metadata: name: odin-service spec: selector: type: demo type: NodePort ports: - protocol: TCP port: 8000 targetPort: 80 nodePort: 30390 ``` :::warning ==Deployment "auth-service-deployment" is invalid: spec.selector: Invalid value: v1.LabelSelector{MatchLabels:map[string]string{"type":"demo1"}, MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is immutable== 當更改selector,需要刪除服務在新建 ::: ```yaml! // deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: chat-service-deployment labels: type: chat-demo spec: replicas: 1 selector: matchLabels: type: chat-demo template: metadata: labels: type: chat-demo spec: restartPolicy: Always //default containers: - name: chat-service image: odinveve/chat-service ports: - containerPort: 8080 ``` - Always: Pod終止就重啟, 此為default設定。 - OnFailure: Pod發生錯誤時才重啟。 - Never: 從不重啟。 ### 基本部署種類 k8s目前簡單的種類有兩種,重建部署策略(Recreate)、滾動部署(Ramped aka. Rolling-update) ```yaml! // app-v1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: auth-service-deployment labels: app: auth-service spec: replicas: 3 strategy: type: RollingUpdate //default rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: auth-service template: metadata: labels: app: auth-service version: v1 spec: containers: - name: auth-service image: odinveve/auth-service ports: - containerPort: 8080 ``` ### 由於k8s server API沒有==stop==這個概念,若要關閉了話,直接吧==replicas==設成==0==即可 ### 刪除全部 kubectl delete all --all --namespace default ## Minikube ### 啟動dashboard minikube dashboard ### service為loadBalancer時,要expose去建立外部IP(測試會需要) minikube tunnel ### 為service建立通道,並返回一個可造訪的URL minikube service <service_name> -n <sn>