文章来源 | MS08067 安全实验室
本文作者:Taoing(Web安全攻防讲师)
一.部署pod
1. kubectl run 直接部署pod
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
2. 使用yaml文件创建pod
apiVersion:API版本
kind:类型
metadata:数据元
name:定义pod的名字
spec:规格
containers:容器
name:容器名字
image:镜像地址
kubectl apply -f pod.yaml
这里我没有拉取到,使用别人的图解释下。
test-k8s 是使用yaml文件创建的
testapp 是使用 命令行创建的。
3.部署
Deployment 通过 label 关联起来 Pods
4. pod 常用操作命令
部署应用
kubectl apply -f app.yaml
kubectl get pod -o wide
describe查看 pod 详情
查看pod运行日志
kubectl logs pod-name
exec进入 Pod 容器终端
kubectl exec -it pod-name -- bash
复制文件操作
pod集群内端口映射到节点
kubectl get all 查看全部
更多命令
二.部署service
1. service特性
·Service 通过 label 关联对应的 Pod
·Service 生命周期不跟 Pod 绑定,不会因为Pod 重建 改变IP
·提供负载均衡功能,自动转发流量到不同的Pod
·可以对集群外部提供访问端口
·集群内部可通过服务名字访问
2. 创建service
通过标签test-k8s跟对应的 Pod 关联上
该service的名字是test-k8s;
通过标签app: test-k8s与pod进行关联。
service.yaml
应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc
查看服务详情 kubectl describe svc test-k8s
可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。
服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
如果你用 minikube,也可以这样minikube service test-k8s
多端口
多端口时必须配置 name
总结
ClusterIP
默认的,仅在集群内可用
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装METALLB测试)
会额外生成一个 IP 对外服务。
三.部署StatefulSet
1. 什么是 StatefulSet
StatefulSet 是用来管理有状态的应用,例如数据库。
之前我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。
而像数据库、Redis 这类有状态的,则不能随意扩充副本。
StatefulSet 会固定每个 Pod 的名字
2. 部署 StatefulSet 类型的 Mongodb
kubectl apply -f mongo.yaml
kubectl get StatefulSet
StatefulSet 特性
Service的CLUSTER-IP是空的,Pod 名字也是固定的。
Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
销毁是逆序的
Pod 重建不会改变名字,除了IP,所以不要用IP直连
Endpoints 会多一个 hostname
kubectl get Endpoints mongodb -o yaml
访问时,如果直接使用 Service 名字连接,会随机转发请求
要连接指定 Pod,可以这样pod-name.service-name
运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash