欢迎光临散文网 会员登陆 & 注册

学习日志 21-12-15 k8s入门 扩容等

2021-12-15 18:02 作者:mayoiwill  | 我要投稿

# pod运维


## proxy到pod的服务

- pod 的名字格式 deployment名 + ID

- app标签 - deployment名?

- pod自己的ip 172.17.0.2

- 使用如下方式直接访问pod的实际应用服务(80端口)

  ```

  http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

  ```

  - 参数解释

  - api v1 ?

  - namespaces default

  - pods $POD_NAME

  - /proxy 表示代理到pod上的端口


## 看日志

- 看日志 `kubectl logs $POD_NAME`

  - 日志是具体pod哪个目录的日志 这个是看的应用的标准输出

  - pod默认启动/监听的是哪个进程?


## 登录pod

- bash这个pod

  ```

  .\kubectl.exe exec -ti kubernetes-bootcamp-565f8cdbd6-mh4xt -- bash

  ```

## Q&A

- Q: pod默认启动/监听的是哪个进程

- A: ??

- Q: kubectl proxy 形式如何访问pod的非标端口8080

- A: 查API文档

  - https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

  - ??


# Service


## 创建service

- 查看当前service `kubectl get services`

  - 已有一个minikube创建的默认service叫kubernetes 不用管它

- 创建新的

  - `kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080`

  - 操作 - expose

  - 资源类型 - 无

  - 资源名 - deployment/kubernetes-bootcamp

  - 细节参数 - --type="NodePort" --port 8080

- 再次 get services 查看结果

- 查看service细节

  - `kubectl describe services/kubernetes-bootcamp`

  - 操作 - describe

  - 资源类型 - 无

  - 资源名 - services/kubernetes-bootcamp

  - expose 用的是 deployment/{部署名}

  - 创建好service后, 做describe时 用的是 services/{部署名}

  - deployment和services 之间 是不是 1:1 的关系?

    - 不一定, 但label是一样的, 通过label一样可以查service外部端口

    - 比如同一个pod, 可以暴露一个443服务端口 + 一个java debug调试端口

  - 目的是找service的外部端口, 我们指定了内部端口是8080

  - 但是外部端口是随机的

  - 根据 NodePort 一行 (我们这个服务的类型就是NodePort)

  - 这个就是服务的外部暴露端口

  - IP用的是minikube的IP (不是kubectl proxy的localhost)

- service用minikube的ip, 但kubectl proxy用localhost 原因?

  - 因为service最终是要开发给用户的, 它是公开的

  - 但是kubectl proxy是管理面, 是管理员自己用的, 是不公开的

  - 所以无法用minikube ip去访问管理面, 必须用kubectl proxy

  - kubectl proxy用了 .kube 下的配置, 这些配置里包括一个密钥

  - 这个密钥是最终外部用户不知道的

  - kubectl proxy只能从本机访问


## labels

- 查看 deployment

  - `kubectl describe deployment`

  - 得到label是 `app=kubernetes-bootcamp`

- 根据label查pods (根据deployment查pods)

  - `kubectl get pods -l app=kubernetes-bootcamp`

- 根据label查service (根据deployment查service)

  - `kubectl get services -l app=kubernetes-bootcamp`

- 给pod打个新的label

  - `kubectl label pods $POD_NAME version=v1`

  - 根据新label `version=v1` 查pods

  - `kubectl get pods -l version=v1`


## 删除service

- 删除指令

  - `kubectl delete service -l app=kubernetes-bootcamp`

  - 根据label删除


# 扩容


## 检查 replicaset(rs)

- 命令

  `kubectl get rs`


## 扩容

- 命令

  - `kubectl scale deployments/kubernetes-bootcamp --replicas=4`

  - 操作 - scale

  - 资源类型 - 按第二类在资源名字段体现

  - 资源名 - deployments/{部署名}

  - 细节参数 - `--replicas=4`

- 检查扩容结果

  - `kubectl get deployments`

  - `kubectl get pods -o wide`

  - `kubectl describe deployments/kubernetes-bootcamp`

    - 有events纪录

- 总结

  - 扩容是针对deployment的

  - 可以从pods级看到扩容的结果

  - pod的命名是 {部署名}-{rs名}-{pod名}

  - 其中rs名和pod名是系统随机生成

  - 扩容时, 目前看pods都属于同一个rs

  - rs 和 deployment的区别是

    - 见下 rs跟着镜像版本走 当deployment的镜像更新后 会产生新的rs

  - describe和get的参数差不多? describe给详情信息


## 负载均衡?

- 检查service

  - `kubectl describe services/kubernetes-bootcamp`

- 使用service访问

  - `curl http://172.25.123.232:31092`

  - 其中31092是external port(nodeport)

- 实际访问发现负载有sticky现象?? 原因?


## 缩容

- 命令 和扩容一致 减少replicaset的数量

  - `kubectl scale deployments/kubernetes-bootcamp --replicas=2`


# 发布更新镜像到deployment


## 检查当前deployment状态

- 现有2, 要求4, 扩容一下


## 更新

- 命令

  - `kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2`

  - 操作 - set

  - 资源类型 - image

  - 资源名 - deployments/kubernetes-bootcamp

  - 细节参数 - `kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2`

    - 等号前面是container的名字, 需要通过describe pods确认

    - 新版container名字是有随机token后缀的

- 这个镜像库能否访问?

  - 参考 配置k8s使用私有镜像库

  - https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

  - 直接浏览器访问一下 jocatalin.com 能通

    - 镜像库省略.com 默认应该就是 .com

- 更新结果 通过 get pods确认

  - pod第二段名字 rs 名字被改了

  - 可见 rs是跟着镜像版本走的

  - 解释了同一个deployment下有不同的rs的意义

- 看一下service的负载均衡

  - `kubectl describe services/kubernetes-bootcamp`

- 查看rollout status 

  - `kubectl rollout status deployments/kubernetes-bootcamp`

  - 当前状态是 successfully rolled out


### Q&A

- Q: 报错 container不存在

- A: 通过describe pods查看正确的container名字 比如

  - google-samples-kubernetes-bootcamp-7jdm5

  - `kubectl set image deployments/kubernetes-bootcamp google-samples-kubernetes-bootcamp-7jdm5=jocatalin/kubernetes-bootcamp:v2`


## 回滚

- 创建一个错误的更新 

  - `kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10`

  - 注意替换container名字

  - 这个目标镜像是错的

    - 没有v10

    - 网也不通

  - 该命令立即返回 看不出成功/失败

    - 异步处理 k8s设计特点

- 校验刚才错误的结果

  - `kubectl get deployments`

  - `kubectl get pods`

  - `kubectl describe pods`

  - `kubectl rollout status deployments/kubernetes-bootcamp`

    - 这个指令类似 tail -f 等着刷新

- 回滚

  - `kubectl rollout undo deployments/kubernetes-bootcamp`

  - 再次检查 rollout status 结果 successfully rolled out

  - 和成功更新一样 继续查pods

  - `kubectl describe pods`


# Learn Kubernetes Basics 总结

- 6个小节都讲完了


# Configuration 学习

- 缺少搭建k8s服务的基本知识, 先暂缓该主题


# 从零开始搭建k8s上的spring boot web服务

- TODO


学习日志 21-12-15 k8s入门 扩容等的评论 (共 条)

分享到微博请遵守国家法律