K8S是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
pod生命周期:创建 —>> 发布 —>> 更新 —>> 回滚 —>> 删除
今天用一个小例子实现一下k8s的动态弹性伸缩 动态的回滚和滚动更新,及负载均衡的功能。
touch namespase.yaml
vim namespase.yaml
apiVersion: v1 #类型为Namespace
kind: Namespace #类型为Namespace
metadata:
name: ssx-nginx-ns #命名空间名称
labels:
name: lb-ssx-nginx-ns
k8s的创建命令:
kubectl create
如果不存在则创建,如果存在,则报错
kubectl apply
如果不存在则创建,如果存在,则更新
kubectl create -f namespase.yaml
kubectl get ns
kubernetes通过Deployment和ReplicaSet(rs)管理多个Pod。
touch deployment.yaml
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx #为该Deployment设置key为app,value为nginx的标签
name: ssx-nginx-dm
namespace: ssx-nginx-ns
spec:
replicas: 2 #副本数
selector: #标签选择器,与上面的标签共同作用
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: ssx-nginx-c
image: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问
ports:
- containerPort: 80 # 开启本容器的80端口可访问
kubectl create -f deployment.yaml
如果不指定命名空间就会去查默认的命名空间,所以最好带上命名空间 -n 自己的空间。
查看所有pod
kubectl get pod -n ssx-nginx-ns
根据配置文件中 replicas: 2 #副本数 参数这里看到我们启动了两个容器。
kubectl describe:查看特定资源或资源组的详细信息
kubectl describe pods ssx-nginx-dm-d9cd6595-6wnz2 -n ssx-nginx-ns
Pod启动成功以后 k8s内部会分配一个ip,只能内部访问,外部无法访问.
默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口
touch service.yaml
vim service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: ssx-nginx-sv
namespace: ssx-nginx-ns
spec:
ports:
- port: 9000 #我暂时不理解,这个设置 明明没用到?
name: ssx-nginx-last
protocol: TCP
targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了
nodePort: 31090 #外网访问的端口
selector:
app: nginx
type: NodePort
kubectl create -f service.yaml
查看:
kubectl get services、 kubectl get svc 都是一样的效果.
kubectl get svc -n ssx-nginx-ns
curl 10.108.93.169:9000
对于kubernetes来说Pod是资源调度最小单元,kubernetes主要的功能就是管理多个Pod,Pod中可以包含一个或多个容器,而kubernetes是如可管理多个Pod的呢?对,没错,就是通过控制器,比如Deployment和ReplicaSet(rs)。
查看副本数:
kubectl get deployments -n ssx-nginx-ns
增加副本:
命令语法:
scale [–resource-version=version] [–current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
kubectl scale deployments/ssx-nginx-dm --replicas=3 -n ssx-nginx-ns
查看deployments 数:
kubectl get deployments -n ssx-nginx-ns
通过 kubectl get pods -n ssx-nginx-ns 可以看到当前的 Pod 也增加到了 3 个:每次请求发送到不同的 Pod,3 个副本轮训处理,这样就实现了负载均衡。
删除一个pod
kubectl delete po ssx-nginx-dm-d9cd6595-s2pv4 -n ssx-nginx-ns
因为 Kubernetes 是声明式 API,所以删掉了之后,Pod API 对象就与预期的不一致了,所以会自动重新创建 Pod 保持与预期一致:
但是如果ReplicaSet 管理的 Pod 对象很多的话,那么要一个个手动删除,会很麻烦,所以可以使用:
kubectl delete replicaset {rs_name} -n {namespace}
要 scale down 也很方便,下面将删除一个副本(副本数变为 1)
kubectl scale deployments/ssx-nginx-dm --replicas=1 -n ssx-nginx-ns
Rolling Update 会边启动新的 Pod 边停止旧的 Pod,比如 replicas 是 3,然后有一个 Service 连着这三个 Pod,那么在做 Rolling Update 的时候,会先启动一个新版本的 Pod,并且这个 Pod 也会连上 Service,然后停掉其中一个旧的 Pod,再启动新版本的 Pod,再停止旧的 Pod,如此循环,直到 3 个 Pod 都是新版的为止。
可以不用使用yml配置文件, 直接替换镜像版本:
kubectl set image deployment =
去搜一个nginx的版本,其他镜像也是同理,选择你需要的版本。
kubectl set image deployment/ssx-nginx-dm ssx-nginx-c=nginx:1.14.0 -n ssx-nginx-ns
通过 kubectl get pods 可以观察滚动更新的过程,可以看到 老版本nginx版本 的 Pod 被逐个删除,同时启动了新的 1.14.0版本的 Pod。
kubectl rollout deployment/ssx-nginx-dm -n ssx-nginx-ns
也可以使用 --revision参数指定某个历史版本:
kubectl rollout undo deployment/ssx-nginx-dm --to-revision=2 -n ssx-nginx-ns
如果想知道历史版本镜像,可以通过这个命令:
kubectl rollout history deployment/ssx-nginx-dm -n ssx-nginx-ns
项目下线,即删除对应deployment与service资源:
kubectl delete deployment nginx
kubectl delete svc nginx