K8S和容器化编排
第一章:快速入门 相关
xxx(minikube) start 启动集群
kubectl get nodes 查看节点的集群
kubectl version 查看集群的状态
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
创建一个部署deployment 应用名 镜像地址
Deployment是Kubernetes的术语,可以理解为应用。
同时deployment管理Pods的创建和扩展。这个抽象的概念也是为了方便管理pod,也是一个controller,来管理pod
kubectl get deployments 查看deployments列表信息
Pod是容器的集合,通常会将紧密相关的一组容器放到一个Pod中,同一个Pod中的所有容器共享IP地址和Port空间,也就是说它们在一个network namespace中。
kubectl proxy 给pod创建代理端口
kubectl get pods 查看当前的Pod
pod往往运行在具体的node中,node在k8s中就是具体的物理机或者虚机,然后其中会有一个node对象,通过master进行控制;一个node可以有多个pod,取决于node自身资源的限制大小。
master控制node,通过kubelet组件的方式。
kubectl describe pods
描述查看pod内部的container情况。 describe也可以用来展示demployments,node,service等信息
暴露端口-外部访问应用
export POD_NAME=$(kubectl get pods -o go-template --template ‘{
{range.items}}{
{.metadata.name}}{
{"\n"}}{
{end}}’)
echo $POD_NAME
kubectl expose deployment/kubernetes-bootcamp --type=“NodePort” --port 8080 将Deployment暴露为外部可访问的服务
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
访问对应pod的API
kubectl exec $POD_NAME env 在容器中执行命令,进入到pod中,使用pod的name作为参数:含义 访问对应pod的环境变量
kubectl exec -ti $POD_NAME curl localhost:8080 进入到POD中执行curl localhost:8080 的命令
kubectl exec -it my-pod --container main-app -- /bin/bash 打开到main-app的shell的容器里
Kubernetes Services:
一种抽象,协调逻辑pod和访问他们的策略,服务所针对的pod集通常由LabelSelector确定。
type in the ServiceSpec:
ClusterIP ,NodePort,LoadBalancer,ExternalName
k8s的控制器
1、ReplicationController
2、ReplicaSet
3、Deployment
4、StatefulSet
5、DaemonSet
6、Job,Cronjob
7、HPA(HorizontalPodAutoscaler)
总体上来说,Kubernetes中拥有三种类型的controller:
Job:通常用于管理一定会结束的Pod。如果希望Pod被Job controller管理,那么restartPolicy必须指定为OnFailure或Never。
ReplicationController,ReplicaSet和Deployment:用于管理永远处于运行状态的Pod。
如果希望Pod被此类controller管理,那么restartPolicy必须指定为Always。
DaemonSet:它能够保证你的Pod在每一台Node都运行一个副本。
虽然也 ReplicaSet 可以独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment还支持版本记录、回滚、暂停升级等高级特性
yaml描述文件:
apiVersion: apps/v1
kind: StatefulSet
metadata:
spec:
status:
kubectl get deployments 查看应用部署的信息
kubectl get pods -l run=kubernetes-bootcamp 查询到labels下values值为 run=kubernetes-bootcam 的pod
kubectl get services -l run=kubernetes-bootcamp 查询道Labels下的值为 run=kubernetes-bootcamp 的service
kubectl delete service -l run=kubernetes-bootcamp 删除一个Labels下的值为run=kubernetes-bootcamp的service
kubectl get rs 查看由Deployment创建的复制集(查看系统中ReplicaSet对象)
扩容服务命令:
kubectl scale deployments/kubernetes-bootcamp --replicas=4 将名字是kubernetes-bootcamp的deployments 的复制集(副本)扩成4个。
kubectl get pods -o wide 查看现有的pods的所有完整信息
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template=’{
{(index .spec.ports 0).nodePort}}’)
将端口号输出为环境变量
滚动更新镜像:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
查看集群服务信息:
kubectl describe services/kubernetes-bootcamp
Rollout命令来确认部署应用更新的状态
kubectl rollout status deployments/kubernetes-bootcamp
Rollback an update(更新回滚)出现更新错误 就可以执行往上一个版本回滚的命令
kubectl rollout undo deployments/kubernetes-bootcamp
总结:
通过一些官方的交互文档,大概了解了一些k8s概念上的东西,知道Master管控着NODE,同时下面有Deployment等控制器对象去控制ReplicaSet和Pod的生成和管理
一些快速查看集群部署和POD状态和命令。
资源限制
Kubernetes 通过 cgroups 提供容器资源管理的功能,可以限制每个容器的 CPU 和内存 使用,比如对于刚才创建的 deployment,可以通过下面的命令限制 nginx 容器最多只用 50% 的 CPU 和 128MB 的内存,
apiVersion: v1
kind: Pod
metadata:
labels: app: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
limits:
cpu: "500m"
memory: "128Mi"
第二章 重要概念
Cluster(集群):
Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用。
Master(主机):
Master是Cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master运行Linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个Master。
Node(节点):
Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。Node运行在Linux操作系统上,可以是物理机或者是虚拟机。
Pod(工作单元):
Pod是Kubernetes的最小工作单元。每个Pod包含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。
一个Pod只会在一个Node上运行。
引入Pod主要基于下面两个目的:
1)可管理性:有些容器天生就是需要紧密联系,一起工作。Pod提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes以Pod为最小单位进行调度、扩展、共享资源、管理生命周期。
2)通信和资源共享:Pod中的所有容器使用同一个网络namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当Kubernetes挂载volume到Pod,
本质上是将volume挂载到Pod中的每一个容器
Pods有两种使用方式:
1)运行单一容器:one-container-per-Pod是Kubernetes最常见的模型,这种情况下,只是将单个容器简单封装成Pod。即便是只有一个容器,Kubernetes管理的也是Pod而不是直接管理容器。
2)运行多个容器:问题在于:哪些容器应该放到一个Pod中?答案是:这些容器联系必须非常紧密,而且需要直接共享资源。
Controller(控制器):
Kubernetes(K8S)通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本、在什么样的Node上运行等。为了满足不同的业务场景,
Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等,逐一解释讨论:
(1)Deployment是最常用的Controller,比如在线教程中就是通过创建Deployment来部署应用的。Deployment可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
(2)ReplicaSet实现了Pod的多副本管理。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本的,我们通常不需要直接使用ReplicaSet。
(3)DaemonSet用于每个Node最多只运行一个Pod副本的场景。正如其名称所揭示的,DaemonSet通常用于运行daemon。
(4)StatefuleSet能够保证Pod的每个副本在整个生命周期中名称是不变的,而其他Controller不提供这个功能。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化