【Kubernetes 系列】一文学会Kubernetes Service安全的暴露应用(1)

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

直接执行命令:

$ unset KUBECONFIG

再次执行:

$ kubectl apply -f ./run-my-nginx.yaml

$ kubectl get pods -l run=my-nginx -o wide

执行结果输出节点如下:

在这里插入图片描述

当然,我们也可以使用命令行,检查pod 的IP地址:

$ kubectl get pods -l run=my-nginx -o yaml | grep podIP

输出当前节点IP:

在这里插入图片描述

我们能够通过 ssh 登录到集群中的任何一个节点上,并使用诸如 curl 之类的工具向这两个 IP 地址发出查询请求。 需要注意的是,容器不会使用该节点上的 80 端口,也不会使用任何特定的 NAT 规则去路由流量到 Pod 上。 这意味着可以在同一个节点上运行多个 Nginx Pod,使用相同的 containerPort,并且可以从集群中任何其他的 Pod 或节点上使用 IP 的方式访问到它们。

2.2、创建 Service


上面创建了一个扁平的、集群范围的地址空间中运行 Nginx 服务的 Pod ,要想把它暴露出去,我们还需要创建一个Service。

Kubernetes Service 是集群中提供相同功能的一组 Pod 的抽象表达。 当每个 Service 创建时,会被分配一个唯一的 IP 地址(也称为 clusterIP)。 这个 IP 地址与 Service 的生命周期绑定在一起,只要 Service 存在,它就不会改变。 可以配置 Pod 使它与 Service 进行通信,Pod 知道与 Service 通信将被自动地负载均衡到该 Service 中的某些 Pod 上。

直接使用 命令给 上面的 Nginx 副本创建一个 Service:

$ kubectl expose deployment/my-nginx

$ service/my-nginx exposed

当然,我们也可以直接使用YAML 方式去创建,创建方式和上面创建pod 的一样,可以直接使用如下代码:


apiVersion: v1

kind: Service

metadata:

  name: my-nginx

  labels:

    run: my-nginx

spec:

  ports:

  - port: 80

    protocol: TCP

  selector:

    run: my-nginx



此时点击左侧菜单栏中的Serverces,你会看到当前Serverces 的详细信息:

在这里插入图片描述

上面我们创建的 Service 会将所有具有标签 run: my-nginx 的 Pod 的 TCP 80 端口暴露到一个抽象的 Service 端口上(targetPort:容器接收流量的端口;port:可任意取值的抽象的 Service 端口,其他 Pod 通过该端口访问 Service)。

现在,我们执行下面的命令查看Service 资源:

$ kubectl get svc my-nginx

资源输出如下图所示:

在这里插入图片描述

前面我也提到,一个 Service 由一组 Pod 提供支撑。这些 Pod 通过 endpoints 暴露出来。 Service Selector 将持续评估,结果被 POST 到一个名称为 my-nginxEndpoint 对象上。 当 Pod 终止后,它会自动从 Endpoint 中移除,新的能够匹配上 Service Selector 的 Pod 将自动地被添加到 Endpoint 中。 检查该 Endpoint,注意到 IP 地址与在第一步创建的 Pod 是相同的。

$ kubectl describe svc my-nginx

执行上面的命令,我们可以得到当前serverces 的所有信息:

在这里插入图片描述

$ kubectl get ep my-nginx

现在,我们执行上面的命令,就可以暴露我们的service了,执行结果如下:

NAME ENDPOINTS AGE

my-nginx 172.17.0.3:80,172.17.0.8:80 23m

现在我们就能够从集群中任意节点上使用 curl 命令向 <CLUSTER-IP>:<PORT> 发送请求以访问 Nginx Service。

2.3、访问 Service


Kubernetes支持两种查找服务的主要模式: 环境变量和 DNS。这里我将只介绍环境变量的查找方式。

当 Pod 在节点上运行时,kubelet 会针对每个活跃的 Service 为 Pod 添加一组环境变量。 这就引入了一个顺序的问题。为解释这个问题,让我们先检查正在运行的 Nginx Pod 的环境变量。

我个人的环境变量是 my-nginx-cf54cdbf7-vr96x 你的可能会和我的不一样,直接在pod 中查看直接的环境变量。

在这里插入图片描述

接下来执行命令:

$ kubectl exec my-nginx-cf54cdbf7-vr96x – printenv | grep SERVICE

运行结果如下:

KUBERNETES_SERVICE_HOST=10.96.0.1

KUBERNETES_SERVICE_PORT=443

KUBERNETES_SERVICE_PORT_HTTPS=443

能看到环境变量中并没有你创建的 Service 相关的值。这是因为副本的创建先于 Service。 这样做的另一个缺点是,调度器可能会将所有 Pod 部署到同一台机器上,如果该机器宕机则整个 Service 都会离线。 要改正的话,我们可以先终止这 2 个 Pod,然后等待 Deployment 去重新创建它们。 这次 Service 会先于副本存在。这将实现调度器级别的 Pod 按 Service 分布(假定所有的节点都具有同样的容量),并提供正确的环境变量。

分别执行如下两行命令:

$ kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=2;

$ kubectl get pods -l run=my-nginx -o wide

在这里插入图片描述

你可能注意到,Pod 具有不同的名称,这是因为它们是被重新创建的。

现在我们再次执行Nginx Pod 环境变量命令,注意:现在你的环境变量又变了,请验证:

$ kubectl exec my-nginx-cf54cdbf7-fhghk – printenv | grep SERVICE

终于,我们在运行结果中,看到了Service 相关的值:

KUBERNETES_SERVICE_PORT_HTTPS=443

MY_NGINX_SERVICE_HOST=10.97.238.70

KUBERNETES_SERVICE_HOST=10.96.0.1

KUBERNETES_SERVICE_PORT=443

MY_NGINX_SERVICE_PORT=80

2.4、保护 Service


到现在为止,我们只在集群内部访问了 Nginx 服务器。在将 Service 暴露到因特网之前,我们希望确保通信信道是安全的。 为实现这一目的,需要:

  • 用于 HTTPS 的自签名证书(除非已经有了一个身份证书)

  • 使用证书配置的 Nginx 服务器

  • 使 Pod 可以访问证书的 Secret

我们可以直接通过手动执行步骤执行操作下列命令:

$ make keys KEY=/tmp/nginx.key CERT=/tmp/nginx.crt

$ kubectl create secret tls nginxsecret --key /tmp/nginx.key --cert /tmp/nginx.crt

$ secret/nginxsecret created

$ kubectl get secrets

输出结果如下:

NAME TYPE DATA AGE

default-token-t7mbb kubernetes.io/service-account-token 3 56m

以下是 configmap:

$ kubectl create configmap nginxconfigmap --from-file=default.conf

$ configmap/nginxconfigmap created

$ ubectl get configmaps

输出结果如下:

NAME DATA AGE

kube-root-ca.crt 1 58m

以下是你在运行 make 时遇到问题时要遵循的手动步骤(例如,在 Windows 上):


# 创建公钥和相对应的私钥

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /d/tmp/nginx.key -out /d/tmp/nginx.crt -subj "/CN=my-nginx/O=my-nginx"

# 对密钥实施 base64 编码

cat /d/tmp/nginx.crt | base64

cat /d/tmp/nginx.key | base64



使用前面命令的输出来创建 yaml 文件,如下所示。 base64 编码的值应全部放在一行上。


apiVersion: "v1"

kind: "Secret"

metadata:

  name: "nginxsecret"

  namespace: "default"

type: kubernetes.io/tls  

data:

  tls.crt: "这里放你的编码"

  tls.key: "这里放你的编码"



现在使用文件创建 Secret:

$ kubectl apply -f nginxsecrets.yaml

$ kubectl get secrets

执行结果:

NAME TYPE DATA AGE

default-token-t7mbb kubernetes.io/service-account-token 3 62m

现在修改 nginx 副本以启动一个使用 Secret 中的证书的 HTTPS 服务器以及相应的用于暴露其端口(80 和 443)的 Service:


apiVersion: v1

kind: Service

metadata:

  name: my-nginx

  labels:

    run: my-nginx

spec:

  type: NodePort

  ports:

  - port: 8080

    targetPort: 80

    protocol: TCP

    name: http

  - port: 443

    protocol: TCP

    name: https

  selector:

    run: my-nginx

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: my-nginx

spec:

  selector:

    matchLabels:

      run: my-nginx

  replicas: 1

  template:

    metadata:

      labels:

        run: my-nginx

    spec:

      volumes:

      - name: secret-volume

        secret:

          secretName: nginxsecret

      - name: configmap-volume

        configMap:

          name: nginxconfigmap

      containers:

      - name: nginxhttps

        image: bprashanth/nginxhttps:1.0

        ports:

        - containerPort: 443

        - containerPort: 80

        volumeMounts:

        - mountPath: /etc/nginx/ssl

          name: secret-volume

        - mountPath: /etc/nginx/conf.d

          name: configmap-volume



关于 nginx-secure-app 清单,值得注意的几点如下:

  • 它将 Deployment 和 Service 的规约放在了同一个文件中。

  • Nginx 服务器通过 80 端口处理 HTTP 流量,通过 443 端口处理 HTTPS 流量,而 Nginx Service 则暴露了这两个端口。

  • 每个容器能通过挂载在 /etc/nginx/ssl 的卷访问秘钥。卷和密钥需要在 Nginx 服务器启动之前配置好。

$ kubectl delete deployments,svc my-nginx; kubectl create -f ./nginx-secure-app.yaml

这时,你可以从任何节点访问到 Nginx 服务器。


kubectl get pods -o yaml | grep -i podip

    podIP: 10.244.3.5

node $ curl -k https://10.244.3.5

...

<h1>Welcome to nginx!</h1>



注意最后一步我们是如何提供 -k 参数执行 curl 命令的,这是因为在证书生成时, 我们不知道任何关于运行 nginx 的 Pod 的信息,所以不得不在执行 curl 命令时忽略 CName 不匹配的情况。 通过创建 Service,我们连接了在证书中的 CName 与在 Service 查询时被 Pod 使用的实际 DNS 名字。 让我们从一个 Pod 来测试(为了方便,这里使用同一个 Secret,Pod 仅需要使用 nginx.crt 去访问 Service):


apiVersion: apps/v1

kind: Deployment

metadata:

  name: curl-deployment

spec:

  selector:

    matchLabels:

      app: curlpod

  replicas: 1

  template:


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/97fa94e94887fa5960d061a3e142a817.png)
![img](https://img-blog.csdnimg.cn/img_convert/2961df62fbb9b6376025438933251c86.png)
![img](https://img-blog.csdnimg.cn/img_convert/d7045109b7f5796139b556bd4c64428b.png)
![img](https://img-blog.csdnimg.cn/img_convert/e414d002845dcff0dd36f1caeb448148.png)
![img](https://img-blog.csdnimg.cn/img_convert/8ed4c8cba3ee6f00396c1a265913647d.png)
![img](https://img-blog.csdnimg.cn/img_convert/068f20566d70479bf6684e2c0a062caf.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-kF16lUoh-1715563155779)]
[外链图片转存中...(img-AXCFChEW-1715563155780)]
[外链图片转存中...(img-06uiPdA3-1715563155781)]
[外链图片转存中...(img-kDihxGfq-1715563155781)]
[外链图片转存中...(img-3O7xudHs-1715563155782)]
[外链图片转存中...(img-qJLVzcnc-1715563155782)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值