云安全容器安全扫盲 之 如何在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

817ec14412b7fec8f23561c41b049847.png  

apiVersion:API版本

kind:类型

metadata:数据元

name:定义pod的名字

spec:规格

containers:容器

name:容器名字

image:镜像地址

kubectl apply -f pod.yaml

639989fc36674aed3e20e254a30740dc.png

这里我没有拉取到,使用别人的图解释下。

test-k8s 是使用yaml文件创建的

testapp 是使用 命令行创建的。

3.部署

0c1f53b27e403800804a6e93483cf668.png

Deployment 通过 label 关联起来 Pods

2dfb5b281900d2c95557b8eaa8c81e66.png

4. pod 常用操作命令

283ac3c50ee8ef931f3f5c45c2006eea.png102a372d5a8b5550e91a79be06a0db68.png

部署应用

kubectl apply -f app.yaml

681a2d15fa716f1a2dee74e316b46771.png

kubectl get pod -o wide

bfa0d9dc0a41eefc253e48d16a6ccd73.png

describe查看 pod 详情

3cf74e50372d20c53c4ef05dfa8d788c.png

查看pod运行日志

kubectl logs pod-name

b671740ac7515e27b0eb3e3251dd7e6b.png

exec进入 Pod 容器终端

kubectl exec -it pod-name -- bash

a779fdfc3fdb8c03a172130deb558e41.png

复制文件操作

c7915eb1f1944870814740c8855db759.png

pod集群内端口映射到节点

9e777da4febb0953133fed79e683566a.png

76b7e6454df1f25b914b4caa39f31935.png

7a20ad2b0801ef7ace241d44a2840ec1.png

kubectl get all 查看全部

230261ca4972303ee34f0c2a94a5d597.png

更多命令

1420ac47d5ab3740e9e04213023fe721.png

二.部署service

1. service特性

·Service 通过 label 关联对应的 Pod

·Service 生命周期不跟 Pod 绑定,不会因为Pod 重建 改变IP

·提供负载均衡功能,自动转发流量到不同的Pod

·可以对集群外部提供访问端口

·集群内部可通过服务名字访问

6f666e797a674ce110bb8c9e3a2adefd.png

2. 创建service

通过标签test-k8s跟对应的 Pod 关联上

该service的名字是test-k8s;

通过标签app: test-k8s与pod进行关联。

service.yaml

6182e19b07296b47699825e3f508cd87.png

应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc

8ce19ad36c533c93c805995349e7a308.png

查看服务详情 kubectl describe svc test-k8s

可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。

0b4d2323fb82ec83635cc14ce69f2461.png

服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080

如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080

36b3043f93319fbb21191b4cd19a6dd9.png

8a971e8d9f4b22b7831df65461f50893.png

如果你用 minikube,也可以这样minikube service test-k8s

2b70af1c819f95ce20b080f511143390.png

多端口

多端口时必须配置 name

53eef24d92fb102e78b789659b27b681.png

总结

ClusterIP

默认的,仅在集群内可用

NodePort

暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767

LoadBalancer

需要负载均衡器(通常都需要云服务商提供,裸机可以安装METALLB测试)
会额外生成一个 IP 对外服务。

三.部署StatefulSet

1. 什么是 StatefulSet

StatefulSet 是用来管理有状态的应用,例如数据库。

之前我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。

而像数据库、Redis 这类有状态的,则不能随意扩充副本。

StatefulSet 会固定每个 Pod 的名字

2. 部署 StatefulSet 类型的 Mongodb

cfc0d0fc0d89840d36673fd9874bc52f.png5e37ef7b1528449efb6c8b1a83226cf1.png

kubectl apply -f mongo.yaml

8496dbe5803c0474bf64a98416184ba8.png

kubectl get StatefulSet

5b100bf36d1e6213bef843f27927b895.png

StatefulSet 特性

b414f8f0293a8f02f162cbf878ed3950.png

Service的CLUSTER-IP是空的,Pod 名字也是固定的。

1995b3473a42dc53b1c0fbdbccb3823a.png

Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。

bed96c0c717e56d2a8617e42038c1c25.png

524b4bfd8a1ef2b3e30b65c0adac3b05.png

销毁是逆序的

c3df9beacbdfaa43c7bef6eede760526.png

a580b04f08923241a3ee7a37982eb21f.png

Pod 重建不会改变名字,除了IP,所以不要用IP直连

cc03d64d60985e91d14a2d9d8681a003.png

Endpoints 会多一个 hostname

kubectl get Endpoints mongodb -o yaml

17ac2464a513d12fbb5d0d21a51947cc.png

访问时,如果直接使用 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

4a7264c5cf3dca46c64f4e2c8d2ac69f.png

来和20000+位同学加入MS08067一起学习吧!

0b03a4e1985af495b84572385a4b859f.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值