云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

02 | 如何将容器镜像部署到K8s?

你好,我是王炜。
上节课,我们学习了容器镜像的概念以及如何将业务构建成容器镜像。容器镜像是我们学习云原生的起点,同时也会贯穿在云原生的各个环节之中,希望你能多花点时间巩固。这节课,我们一起来看看如何将容器镜像部署到 K8s。
K8s 的系统设计非常复杂,这导致它的学习曲线非常陡峭。尤其是对于刚入门的同学而言,面对繁杂的概念时往往会不知所措,也无从下手。再加上学习过程缺乏实战性的反馈,很容易导致“从入门到放弃”的情况出现。
所以这节课,我打算摒弃概念先行的教学方法,从实战的角度出发,带你从零入门 K8s。
我会继续延伸上一节课程的内容,带你把之前构建的容器镜像部署到 K8s 集群中。在实战的过程中,我也会讲解 K8s 的一些基本概念。
在开始实践之前,你需要做好以下准备:
准备一台电脑(首选 Linux 或 macOS,Windows 也适用,需要稍微注意一下操作上的差异);

安装 Kubernetes

如何获得一个 K8s 集群是每一个开发者需要熟练掌握的内容。
安装 K8s 的方法非常多,有生产级的安装方法,也有以测试为目标的安装方法。为了方便测试,这里我推荐一种在本地安装 K8s 集群的办法:Kind。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以实战为主线,通过具体的操作步骤和概念解释,帮助读者快速了解如何将容器镜像部署到Kubernetes(K8s)集群。作者首先介绍了K8s的复杂系统设计和陡峭学习曲线,然后提出了通过实战来带领读者入门K8s的教学方法。文章详细介绍了安装K8s集群的方法,并推荐了一种在本地安装K8s集群的工具Kind。接着,作者解释了K8s的概念和工作原理,引入了Manifest和Kubectl工具的概念。随后,文章给出了如何编写Manifest并使用Kubectl将容器镜像部署到K8s集群的实际操作步骤。最后,作者提出了在部署完容器镜像后可能面临的问题,并给出了解决方法。通过这些内容,读者可以快速了解K8s的基本概念和操作方法,为初学者提供了一种更直观、更易理解的学习路径。文章还梳理了业务进程、镜像、容器和Pod之间的关系,为读者提供了更全面的知识体系。同时,作者留下了思考题,引发读者思考和交流。整体而言,本文内容丰富,涵盖了K8s的基本概念和实际操作,适合初学者快速入门。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • 陈志成
    kind 有很多设计理念,比如 1. 优雅降级 因为 kind 是专为测试 k8s 设计的,所以自身很顽强。支持所有的 k8s 官方版本,并且如其名字所示,docker 里搞出来的 k8s,集群依赖的所有的镜像都打包在了它的节点镜像里,厉害的是,如果这些镜像损坏了或者丢失了,节点镜像还能帮你重新拉下来,真是打不死的小强。 2. 不重复发明轮子 虽然现在已经有了很多功能类似的软件,比如大名鼎鼎的 kubeadm,但是 kind 并不是来搅局的,他很谦虚的抱着协作的态度,能复用就复用,站稳巨人的肩膀,专注解决痛点,合作共赢。 3. 最小化假设 kind 表示只要求安装 docker 即可,剩下的就交给我了。避免做出任何不必要的假设,minikube 表示,你礼貌吗? 4. 封闭原则,无状态原则 力求操作幂等、避免依赖外部服务,本身不存储或管理状态。好家伙,低内聚,高耦合,本身还没有副作用,不愧是 kind,确实很友好。 5. 避免伤害用户,遵循 k8s API 约定 啥?还有这原则。来看看都啥内容,避免配置和命令行接口的不兼容性修改,严格遵守 k8s 的弃用政策,面向外部的特性考虑扩展性以及长期支持性,使用 k8s 的配置风格,减少参数个数...一上来就海誓山盟还真是不习惯。 另外还有自动化和支持 CRI,感兴趣的可以了解了解 https://kind.sigs.k8s.io/docs/design/principles/

    作者回复: 幽默又不失知识点,优秀!

    2022-12-14归属地:广东
    14
  • Librant
    每节课我都做了实验,有需要的可以参考,写的比较详细,github.com/librant/git-ops-learn,觉得有用帮忙star一下嘞

    作者回复: 赞!

    2022-12-20归属地:广东
    5
  • fireshort
    Kind还没有看。 说一下思考题2: 将 flask-pod.yaml 更新为: apiVersion: v1 kind: Pod metadata: name: hello-world-flask spec: containers: - name: flask image: lyzhang1999/hello-world-flask:latest ports: - containerPort: 5000 - name: nginx image: nginx:1.23.2 ports: - containerPort: 80 执行 kubectl apply -f .\flask-pod.yaml 就可以。 端口转发:kubectl port-forward pod/hello-world-flask 80:80

    作者回复: ✅

    2022-12-13归属地:广东
    4
  • Geek_1e70de
    kind create的时候这个错误是什么原因 ✓ Ensuring node image (kindest/node:v1.27.3) 🖼 ✗ Preparing nodes 📦 Deleted nodes: ["kind-control-plane"] ERROR: failed to create cluster: command "docker run --name kind-control-plane --hostname kind-control-plane --label io.x-k8s.kind.role=control-plane --privileged --security-opt seccomp=unconfined --security-opt apparmor=unconfined --tmpfs /tmp --tmpfs /run --volume /var --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --label io.x-k8s.kind.cluster=kind --net kind --restart=on-failure:1 --init=false --cgroupns=private --publish=0.0.0.0:80:80/TCP --publish=0.0.0.0:443:443/TCP --publish=127.0.0.1:43015:6443/TCP -e KUBECONFIG=/etc/kubernetes/admin.conf kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72" failed with error: exit status 125 Command Output: WARNING: Your kernel does not support cgroup namespaces. Cgroup namespace setting discarded. 47a75af79038f24098f20854447af6a83bc5a0037aea8dc6e2d7cb0706d57493 docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: cgroup namespaces aren't enabled in the kernel: unknown.

    作者回复: 看着是机器的问题,可以开通一个云厂商的竞价型vm做实验。

    2023-08-29归属地:北京
    2
    1
  • 加多
    云原生 和k8s之间是什么关系那?我理解k8s是实现云原生的一个工具?

    作者回复: 是的,一般我们认为云原生技术的核心是 Docker 和 K8s。

    2022-12-25归属地:广东
    2
    1
  • Geek_1e70de
    请问是不是开一台香港的云服务器就可以进行本课程的所有实验呢,ERROR: failed to create cluster: command "docker run --name kind-control-plane --hostname kind-control-plane --label io.x-k8s.kind.role=control-plane --privileged --security-opt seccomp=unconfined --security-opt apparmor=unconfined --tmpfs /tmp --tmpfs /run --volume /var --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --label io.x-k8s.kind.cluster=kind --net kind --restart=on-failure:1 --init=false --cgroupns=private --publish=0.0.0.0:80:80/TCP --publish=0.0.0.0:443:443/TCP --publish=127.0.0.1:43015:6443/TCP -e KUBECONFIG=/etc/kubernetes/admin.conf kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72" failed with error: exit status 125 docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: cgroup namespaces aren't enabled in the kernel: unknown. 这个错误是什么原因

    作者回复: 推荐使用云厂商的vm来做实验。

    2023-08-29归属地:北京
    4
  • Pin
    执行kubectl cluster-info --context kind-kind后报错 To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. The connection to the server 127.0.0.1:58723 was refused - did you specify the right host or port? 请问这个问题怎么解决?

    作者回复: 看起来是 Kind 没启动导致的,连不上集群。

    2023-08-14归属地:上海
  • Kevin
    ## 安装K8S仪表盘,方便对K8S网络进行管理和检查 首先要科学上网,然后执行如下命令: ```powershell kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml ``` 执行如下命令创建一个连接到你的 K8S 集群的 Web 服务器(执行这个命令的窗口不能关): ```powershell kubectl proxy ``` 创建 dashboard-adminuser.yaml 文件,内容如下,用来创建用户: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard ``` 然后在 Windows PowerShell 中执行如下命令,创建用户: ```powershell kubectl apply -f dashboard-adminuser.yaml ``` 执行如下命令,获取用户的登录令牌,每次登录都需要使用下面的命令来获取登录令牌: ```powershell kubectl -n kubernetes-dashboard create token admin-user ``` 打开浏览器访问 [http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/](http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/) 用上一步骤获取到的用户令牌登录管理控制台。

    作者回复: 👍🏻

    2023-05-09归属地:四川
  • 渣渣辉
    第一题 Kubernetes in Docker(Kind)是一个用于在 Docker 容器中运行 Kubernetes 集群的工具。它的设计理念是简化本地 Kubernetes 集群的部署和测试过程,特别是在持续集成(CI)环境中。使用 Kind,用户可以轻松地在本地机器或 CI 环境中创建和管理 Kubernetes 集群。 Kind 的主要优势在于它的便捷性和速度。由于它在 Docker 容器中运行 Kubernetes 集群,因此无需在物理机器或虚拟机上配置和管理复杂的 Kubernetes 环境。这使得 Kind 成为开发和测试 Kubernetes 应用程序的理想工具。 Kind 的工作原理是利用 Docker 提供的节点镜像,这些镜像包含了运行 Kubernetes 所需的所有组件。创建集群时,Kind 会启动一个或多个 Docker 容器,每个容器代表一个 Kubernetes 节点。这些节点通过 Docker 网络进行通信,并由 Kind 自动配置。这使得 Kubernetes 集群的创建和管理变得非常简单。 总之,Kubernetes in Docker(Kind)是一个简化本地 Kubernetes 集群部署和测试的工具,它在 Docker 容器中运行 Kubernetes 集群,使得开发和测试过程更加高效和便捷。 第二题 apiVersion: v1 kind: Pod metadata: name: hello-world-flask spec: containers: - name: flask image: lyzhang1999/hello-world-flask:latest ports: - containerPort: 5000 # 添加nginx - name: nginx image: nginx:latest ports: - containerPort: 80

    作者回复: 👍🏻非常细致的回答!

    2023-04-07归属地:日本
  • tee
    kind 拉起集群之后 apiserver提示 tls链接被对端断开了。

    作者回复: 另外检查一下本地是否有全局代理。

    2023-02-28归属地:湖南
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部