1. K8s的基本使用
建议读者先随意浏览一下本文, 等待安装完k8s之后,再仔细阅读本文。或者使用在线的k8s playground 查看k8s的安装教程
k8s的工作流程大致如下
- 将应用打包成镜像
- 部署应用
- 创建一个pod/deployment
- 或者对已经存在的 deployment 执行镜像版本更新的命令
- 使用 service 暴露应用
主要内容
镜像打包
使用docker 的方式进行镜像打包即可。
- 方案一:写 Dockerfile, 然后 build
- 方案二:使用 docker compose 进行 build
如果是一个java项目,并且使用了spring-boot框架的话,则可以考虑使用命令 ./mvnw spring-boot:build-image
进行打包镜像.
打包好的项目需要推送到一个 docker Registry中, 以供k8s拉取。
如果想要发布到 docker hub 中的话, 可以参考 发布镜像到-docker-hub
不过公司项目的话, 应该还是要搭建一个私有的 Registry。
关于私有的 Registry
待补充
部署应用
先简单的介绍一下 k8s中的几个概念。
- Pod, 可以理解为运行中的容器。
- Deployment 可以理解为管理Pod的一个方式。
笔者将直接跳过 Pod,从 Deployment 开始说明
推荐使用 yaml配置文件的方式进行配置。
下面来看一个 nginx 的 Deployment 的配置文件。
|
|
如果能看得懂简单的英语的话, 很多字段的意义就一目了然了。
笔者来说一下几个重点。
kind: Deployment
指定类型为 Deploymentmetadata
当前 Deployment 的 元数据, 可以理解为一些Deployment的基本信息。labels
是标签部分, 这个比较重要- 内容是 K:V
spec
replicas
部署几个pod ?selector.matchLabels
要匹配的pod的label, 应该与template.metadata.labels
中的值一致template
pod 的模板metadata
部署之后的pod的 元数据, 要指定至少1个用于查询的labelspec.containers
容器相关的信息image
要发布的pod(容器)采用的镜像是哪个?ports
暴露出去的端口
使用命令 kubectl apply -f ./deploy-nginx.yaml
即可发布一个 Deployment 。
发布成功之后, 使用命令 kubectl get pods
可以查看已经存在的pod的信息。
如果pod的STATUS是Running的话, 表示已经成功运行了。 如果是其他情况, 可以使用命令 kubectl describe pods $POD_NAME
查看pod的状态, 注意 $POD_NAME 要替换成
你具体的pod name 。
|
|
暴露应用以供外部访问
先来介绍一下下面的K8S得概念
- Service, 可以简单的理解为一个反向代理把, 把内部的服务暴露给外部。
- Node 工作节点,可以理解为容器的宿主机
创建一个Service 可以使用 expose
命令, 也可以写一个yaml 配置文件。
下面来看一个Service的配置文件。
|
|
笔者来说一下几个重点。
kind: Service
指示这是一个 Service类型的资源spec
type
类型 ClusterIP/NodePort/LoadBalancer/ExternalName 更多解释selector
填写 pod的 label 或者 Deployment中spec.template.metadata.labels
里面的信息。ports
端口port
监听的端口targetPort
目标端口, 容器的端口, 如果没写则与 port一致。nodePort
type: NodePort 时有效, 内容为Node的端口。
使用命令 kubectl apply -f ./service-nginx.yaml
即可发布一个 service。
成功发布之后, 访问NodeIp:30018 即可访问服务。
这里还有几个要点
- 如果安装的是minikube的话,则需要访问
$(minikube ip):30018
- 创建了Service之后, 即可在其他Pod 内部使用名称来访问service
- service-name
- service-name.namespace
- service-name.namespace.svc.cluster.local
- 上面的内容都可以访问到Service,但是端口号还是要附加在名字后面的。
|
|
EXTERNAL-IP 只有 LoadBalancer 类型才会有, 这个一般是由云服务商提供。
expose 在有些时候更快捷一些, 内容可以参见: http://docs.kubernetes.org.cn/475.html
删除资源(Deployment, Service)
- kubectl delete -f ./service-nginx.yaml
- kubectl delete -f ./deploy-nginx.yaml
其他
缩写
pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
比如:
kubectl get services
=>kubectl get svc
其他
如有错误之处, 欢迎指出。