四 入门命令
4.1 kubectl
kubectl 是 apiserver 的客户端程序,这个客户端程序是通过连接 master 节点上的 apiserver ,实现各种 k8s 对象的增删改查等基本操作,在 k8s 可被管理的对象有很多个
4.2 run
创建一个名为 nginx 的 deployment,镜像为 nginx:latest
,如果不知道副本数,则为1
- 指定控制器名称运行 nginx 指定端口和副本数量,以测试模式运行
指定参数 dry-run 可以用来验证写的 yaml 文件是否存在异常,不会真正执行
- 通过 ip 地址直接访问,由于所有的 POD 处于同一个网络中,所以在集群内部是可以访问的
- 假如现在删除刚创建的这个 POD,那么副本控制器会自动在其他的 node 上重建这个 POD
- 再次执行查看,会发现容器已经被调度到其他节点上运行了
4.3 expose
现在存在一个问题,就是 POD 的 IP 地址可能随时发生变动,所以不能作为访问的入口,那么就需要 service 来代理 POD 来创建一个固定的端点。
在控制器 nginx-deploy 上创建名字为 nginx 的 service , 它工作端口为 80, 代理的后端容器端口 80, 协议为 TCP
- 可以看到刚刚创建的名字为 nginx 的 service ,现在就可以在集群内用 service 的地址来访问了, 如果外部访问可以使用 NodePort 模式
4.4 cp
- 拷贝宿主机文件或目录到pod中,⚠️要求tar二进制文件已经存在容器中,不然拷贝会失败
4.5 port-forward
- 端口转发,将svc地址或着pods端口利用kubelet映射到宿主机上,将访问宿主机的8888端口的所有流量转发到8111svc
- 转发pods端口,将访问宿主机的8888端口流量转发到pod的5000端口
4.6 coredns
service 提供了对 pod 的固定访问端点,但是 service 本身的变动我们无法知晓,需要 coredns 对 service 做域名解析。
- 查看各个 kube-system 命名空间运行的服务,可以看到 kube-dns 运行的 IP 地址
- 使用 kube-dns 来解析 nginx 这个 service 的地址就可以正常解析了
- 创建一个访问 nginx 客户端容器,并进入交互式模式,这个容器默认的 dns 服务器就是 kube-dns 所在的服务器
- 在 busybox 这个容器中请求 nginx 这个域名的 service ,能够正常访问
4.7 模拟 POD 被删除
- 现在我们删除 service 后端的 POD ,副本控制器会自动创建新的 POD,而 service 则会自动指向新创建的 POD
- 在 busybox 这个容器中请求 nginx 这个域名的 service ,访问没有受到影响
4.8 模拟 service 被删除
- 当我们删除 service 并且重新建立一个 service 再次查看 service 的地址已经发生变化了
- 在 busybox 这个容器中请求 nginx 这个域名的 service ,访问没有仍然没有受到影响
4.9 labels
为什么 Pod 被删除后,servic 仍然能够正确的调度到新的 POD 上,这就是 k8s 的 labels 这个机制来保证的。
能够使用标签机制不止有 pod、在 k8s 中很多对象都可以使用标签,例如:node、service
- 查看 service 的详细信息,会发现标签选择器
- 查看 POD 的标签,会看到拥有 run=nginx-deploy 标签的容器,而人为删除一个 POD 后,副本控制器创建的副本上的标签不会变化,所以标签又被 service 关联。
- 查看 POD 的详细信息,也可以查看到 POD 的详细信息
- 根据标签过滤,使用 -l 来指定标签名称或同时过滤其值
- 为指定的 POD 打标签,为 client 这个 POD 打上一个 release 标签,其值为 canary
- 修改 POD 的标签,使用 —overwrite 进行修改原有标签
- 删除指定的 nodes 上的标签,使用标签名称加 - 符号
- 许多资源支持内嵌字段来定义其使用的标签选择器,例如 service 关联 pod 时候:
- k8s 中很多对象都可以打标签,例如给 nodes 打一个标记,随后在添加资源时候就可以让资源对节点有倾向性了
4.10 动态扩容
- 扩容一个集群的的 POD,下面命令表示修改 deployment 控制器下的 nginx-deply 容器的副本数量为2
4.11 滚动升级
- 更换 nginx-deploy 这个控制器下的 nginx-deploy 容器镜像为 ikubernetes/myapp:v2
- 查看更新的过程,直到 5 个容器中运行的镜像全部更新完
如果防止更新过程中被调度,那么就需要学习就绪性检测才能实现
4.12 集群外访问
- 修改 service 的网络类型为 NodePort
- 查看 service 的信息,发现多了一个 30982 端口
- 在集群外部使用任意的 node IP 地址 + 端口来访问
4.13 排查日志
4.14 连入 POD 容器