上一部分我们分享到,Statefulset 部署应用,我们需要完成这些资源的创建:
我们已经完成前面 2 部分,若还有疑问的可以看上上一部分的文章
现在可以来专注的编写 Statefulset 资源了
编写 Statefulset 资源其实也比较简单,注意三大部分:
statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sta-kubia
spec:
serviceName: sta-kubia
replicas: 2
selector:
matchLabels:
app: sta-kubia
template:
metadata:
labels:
app: sta-kubia
spec:
containers:
- name: sta-kubia
image: xiaomotong888/sta-kubia
ports:
- name: http
containerPort: 8080
volumeMounts:
- name: data
mountPath: /var/data
volumeClaimTemplates:
- metadata:
name: data
spec:
resources:
requests:
storage: 1Mi
accessModes:
- ReadWriteOnce
还是老规矩,通过 kubectl create -f statefulset.yaml 的方式部署 statefulset ,我们来分别查看一下 pod,持久化卷声明 pvc ,持久化卷 pv
通过指令 kubectl get po 查看 pod 的情况
我们可以查看到 sta-kubia-1 是在 sta-kubia-0 完全启动好,状态变成 Running 状态的时候才开始创建容器的
这是 statefulset 自身的机制,会去一个一个的创建 pod,创建 pod 后会准确的确认该 pod 运行 ok,才会进行创建下一个
这样也是保证安全性的一个设计
任意查看一个 pod 的详情
kubectl describe po sta-kubia-0
可以看到该 pod 会正确的对应上一个卷的声明,且索引和自己 pod 的索引一致
kubectl get pvc
kubectl get pv
我们可以看到 查看 持久化卷声明 pvc 和 查看 持久化卷 pv,总共分别有 2 个,且互相正确对应上的
之前我们知道,我们是通过 Service 与 pod 进行通信,客户端只需要访问 节点的地址和 Service 的端口就可以了**(前提是我们暴露了 Service 的端口)**
还有一种方式就是进入到其中一个 pod 的内部,去访问集群中 Service 的地址和端口
xdm 还记得其实我们还可以使用一种简单的方式,那就是访问通过 API 服务器的方式来访问我们的 pod 元数据,不记得细节的 xdm 可以看看我之前分享的文章 【k8s 系列】k8s 学习二十四,如何访问 pod 元数据
kubectl proxy
我们可以看到咱开启的代理是通过 8001 端口与 Api Server 进行交互的
这个时候,我们就可以通过访问这样的 url 通过代理来请求 ApiServer 了,这算是一个正向代理
还记得,我们镜像中写的应用吗,应用是一个 http 服务器,提供 GET 和 POST 请求?
由于 pod 创建出来,指定的文件还没有,我们可以先使用 POST 请求我们的 pod,然后再使用 GET 请求 pod
POST 请求 pod
curl -X POST -d 'helloworld sta-kubia-0' localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/
此处我们 POST 请求 sta-kubia-0 ,并带上数据 helloworld sta-kubia-0
字符串,请求成功,http 服务器会给我们返回写入成功的内容
GET 请求 pod
curl localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/
GET 请求数据,会将指定文件中的内容打印出来
请千万记住结尾是 proxy/ 而不是 proxy ,否则你是会收到一个空白回应的, k8s 自身也是通过 url 拼接的方式来组装请求地址的
我们可以知道这个 url 是这样来组装的:
地址:端口/api版本/命名空间/pod名称/proxy
如上我们看到,GET 请求和 POST 请求都被正常处理了,那么我们来用图解的方式,看看我们的 curl 请求是怎样到达实际的 ApiServer 的
我们先来看看 ApiServer 的地址和我们访问的 pod 的地址:
ApiServer 的地址
sta-kubia-0 地址
从 curl 请求到 pod sta-kubia-0 的请求过程如下:
从最初发出 curl 请求之后,会经过 kubectl proxy 进行代理,kubectl proxy 会去代理到 8001 端口继续向下访问
kubectl 又会将请求代理到 ApiServer 上,此时请求的是 Apiserver 的地址:8443 端口,看到这里,整个请求实际上是经过了 2 个代理
ApiServer 收到请求后,会去请求实际的 pod sta-kubia-0 地址(172.17.0.1)和端口(8080)
最终 pod 中的容器响应后,数据怎么来,请求就顺利请求路径一层一层的相应,最终,我们在界面上就看到了 pod sta-kubia 的相应结果了
今天就到这里,学习所得,若有偏差,还请斧正
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774