云安全容器安全扫盲 之 如何在Kubenetes(K8S)中部署应用
2022-12-29 15:4:6 Author: www.secpulse.com(查看原文) 阅读量:27 收藏

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


文章来源: https://www.secpulse.com/archives/194329.html
如有侵权请联系:admin#unsafe.sh