云安全容器安全扫盲 之 如何在Kubenetes(K8S)中部署应用

文章来源 | 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


本文作者:Ms08067安全实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/194329.html

Tags:
评论  (0)
快来写下你的想法吧!

Ms08067安全实验室

文章数:49 积分: 154

已出版《Web安全攻防》《内网安全攻防》《Python安全攻防》《JAVA代码安全审计(入门篇)》等书

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号