构建k8s集群

查看k8s集群信息

1
kubectl cluster-info

image-20230208215231265

其中Kubernetes control plane, CoreDNS都是k8s集群中运行的服务;

部署应用

当尝试在不存在的命名空间里面创建一个pod

1
kubectl run kubernetes-bootcapm --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080 -n test-env

image-20230208220031362

Pod 不会在不存在的命名空间中创建,因此我们首先需要创建一个命名空间。

1
2
kubectl create namespace test-env #创建命名空间
kubectl get namespace #获取命名空间列表

image-20230208220127962

现在我们有了一个命名空间,我们想在其中创建一个 pod.

要在我们创建的命名空间中创建一个 pod,请将 –namespace=test-env 选项传递给命令,

1
2
kubectl run kubernetes-bootcapm --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080 -n test-env
# kubectl create deployment kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080 -n test-env

image-20230208220711891

获取属于“test-env”命名空间的 pod 的详细信息

1
2
3
# 如果您尝试在不指定命名空间的情况下获取 pod,您将无法获取 pod 的详细信息
# 获取pod列表
kubectl get pods -n test-env

image-20230208220442709

我们通过kubectl run部署了一个应用,命名为kubernetes-bootcapm,docker镜像通过–image指定, –port设置应用对外服务的端口;

这里的kubernetes-bootcapm应该是一个deployment, 这是k8s的术语,可以理解为应用;

kubernetes还有另外一个重要术语pod, Pod是容器的集合,通常会将紧密相关的一组容器放到一个Pod中,同一个Pod中的所有容器共享IP地址和Port空间,也就是说它们在一个network namespace中。

Pod是Kubernetes调度的最小单位,同一Pod中的容器始终被一起调度;

image-20230208221352364

kubernetes-bootcamp就是应用的pod;

访问应用

默认情况下,所有Pod只能在集群内部访问。对于上面这个例子,要访问应用只能直接访问容器的8080端口。为了能够从外部访问应用,我们需要将容器的8080端口映射到节点的端口;

1
 kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 -n test-env

image-20230208223332475

image-20230208223530381

可以看到这里面有一个service, 可以将service暂时理解为端口映射;

kubernetes-bootcamp是我们应用的service,8080端口已经映射到host的31564端口,端口号是随机分配的,可以执行如下命令访问应用,

31564

image-20230208224324058

Scale应用

默认情况下应用只会运行一个副本,可以通过kubectl get deployments查看副本数。

image-20230208224926139

执行如下命令将副本数增加到3个:

1
kubectl scale  deployments/kubernetes-bootcamp -n test-env --replicas=3

image-20230208225201579

通过kubectl get pods可以看到当前Pod增加到3个:

image-20230208225250048

通过curl访问应用,可以看到每次请求发送到不同的Pod,3个副本轮询处理,这样就实现了负载均衡:

image-20230208225508199

要scale down也很方便,执行下列命令:

image-20230208225653202

从上面截图可以看出,其中的一个副本被删除了;

滚动更新

当前应用使用的image版本为v1,执行如下命令将其升级到v2,

1
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 -n test-env

image-20230208230745108

image-20230208230759767

通过kubectl get pods可以观察滚动更新的过程:v1的Pod被逐个删除,同时启动了新的v2 Pod。更新完成后访问新版本应用:

image-20230208230933915

如果要回退到v1版本也很容易,执行kubectl rollout undo命令:

1
kubectl rollout undo deployments/kubernetes-bootcamp -n test-env

image-20230208231248927

然后我们来验证一下版本是都真的回退到v1:

image-20230208231536388