学习日志 21-12-15 k8s入门 扩容等
# 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