极速上手k8s,Kubernetes 从入门到摸鱼系列-实践篇

news2024/12/22 22:02:43

大家好,我是比特桃。本文为《极速上手k8s,Kubernetes 从入门到摸鱼系列》的实战篇,旨在快速上手k8s。如没有阅读过k8s相关理论的朋友,可以先阅读理论篇。

1. 实践环境

k8s 的意义在于分布式大规模容器编排,所以如果我们想要在实际中发挥它的最大价值,至少也得需要 3 台机器。其中一台是主节点,剩余两台是工作节点。当然,也可以通过虚拟机中创建三个操作系统来实践。但这样操作还是很繁琐,其实在学习中,有更方便的办法进行。

  • minikube
    能让你在本地运行 Kubernetes。 minikube 在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。
  • Kind
    另一个Kubernetes SIGs项目,但与minikube相比有很大不同。顾名思义,它将集群移动到Docker容器中。与生成VM相比,这将显著加快启动速度。
  • Docker Desktop
    在Windows、Mac中常用的Docker Desktop 中也内置了一个 k8s 功能,只需要在设置中即可打开使用。

生产环境上的集群安装和配置不建议使用 kind 或者 minikube。本文采用 minikube 来开展,使用其他的环境其实并没有太大区别。minikube的安装可以查阅官网,根据自身不同的操作系统进行安装。minikube 是可以选择依赖于容器还是本机VM:
在这里插入图片描述
所以我们可以选择使用 Docker 来当做 minikube 运行的地方,命令:

minikube start --driver='docker’
# 如果你在Docker Desktop版本中使用,建议将 Docke Engine 切换为 Linux的版本
docker context ls
docker context use default

2. 配置

在 k8s 中的核心思想就是:声明式无状态。
在这里插入图片描述
所以当我们想通过 API 或 CLI 和 k8s 中主节点中的 API Server 进行通讯的时候,必须采取一种格式。而 CLI 是使用 YAML 格式来进行的, YAML 对于后台开发者来说并不陌生,Spring 中的配置文件也是这个格式。k8s 的 YAML 声明文件分为三个部分:1)metadata;2)specification;3)status。
在这里插入图片描述

细心地朋友会发现,第三个 status 好像并没有在文件中声明。这是因为它是由 k8s 自动生成编辑的。它的主要作用就是,时刻将容器的现有状态(status)与声明状态(specification)相比较,如果发现有区别,则会向声明状态所靠拢。
在这里插入图片描述
比如这里在声明文件中是要两个 Nginx,但实际运行中发现只有一个,k8s 发现后会主动的再创建一个让两者相匹配。status 实际是由 etcd 进行维护的。

3. 实例

这个实例是一个 Node 应用程序,通过访问MongoDB进行数据访问,部署方式如下所示:
在这里插入图片描述
所涉及到的技术点为:

  • ConfigMap:MongoDB 连接信息
  • Secret:MongoDB 用户名及密码
  • Deployment & Service :应用组合及服务

3.1 MongoDB

首先创建 ConfigMap,k8s作为一个工具类的产品,其实可以直接仿照官网的例子来去改写。
在这里插入图片描述
将官网的例子复制下来,改写成如下形式:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-config
data:
  mongo-url: mongo-service

然后创建 Secret,这里需要注意的是,Secret 默认采用了Opaque 的加密方式。我们的用户名和密码需要通过 base64 加密后,粘贴上去。

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
type: Opaque
data:
  mongo-user: bW9uZ291c2Vy
  mongo-password: bW9uZ29wYXNzd29yZA==

最后,我们来声明 Deployment & Service,这两个可以单独写,但也可以写在一起:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-deployment
  labels:
    app: mongo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongodb
        image: mongo:5.0
        ports:
        - containerPort: 27017
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: mongo-user
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: mongo-password  
---
apiVersion: v1
kind: Service
metadata:
  name: mongo-service
spec:
  selector:
    app: mongo
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017

其中的 template 我们第一次见到,它是为了声明 Pod 的,内部也有自己的元数据(metadata)和声明(specification)。这里面最为重要的就是声明中的容器(containers),其实可以理解为 docker-compose 中声明的 image 信息。
labels是一个标签,k8s 可以为任何组件指定一个标签,可以作为一个标识符。比如 Pod 的名字是变化莫测,就可以使用标签(labels)来快速识别和寻找特定的组件。
YMAL 语法中,使用---三个破折号来区分多个配置文件,所以我们使用破折号分割后,又声明了 Service。其中targetPort为 Pod 中声明的端口,port则可以任意指定未使用的端口。

3.2 Application

如法炮制,我们来声明部署应用部分。webapp.yaml如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
  labels:
    app: webapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: nanajanashia/k8s-demo-app:v1.0
        ports:
        - containerPort: 3000
        env:
        - name: USER_NAME
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: mongo-user
        - name: USER_PWD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: mongo-password 
        - name: DB_URL
          valueFrom:
            configMapKeyRef:
              name: mongo-config
              key: mongo-url
---
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  type: NodePort
  selector:
    app: webapp
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
      nodePort: 30100

其中,我们在 APP 的 Service 中声明了 NodePort,它的作用旨在让外部浏览器访问。nodePort则为该 k8s 节点中 ip 所绑定的端口,只是它会有端口范围的限制。
在这里插入图片描述

4. 运行

将 YAML 文件写好后,就可以通过 Kubectl 告诉 k8s 集群,我们要这些服务组件。首先创建ConfigMap、Securit:

kubectl apply -f mongo-config.yaml
kubectl apply -f mongo-secret.yaml

然后创建MongoDB 和 APP应用:

kubectl apply -f mongo.yaml
kubectl apply -f webapp.yaml

在这里插入图片描述
执行kubectl get all查看当前组件状态:
在这里插入图片描述
这里只能看到我们的Deployment、Service、Pod,但配置文件需要单独的命令查询:

kubectl get configmap
kubectl get secret

如果想查看该组件的详细信息,则可以使用该命令:

kubectl describe service webapp-service

在Docker中我们经常查看容器的Log,在 k8s 中查看 pod 日志的命令:

kubectl logs pod名称 -f

总之,kubectl 作为 k8s 最强大的交互工具,它所含的命令集非常多,我们也很难全部记住。就像Linux命令一样,善用-- help~
最后,我们来访问一下这个 k8s 所部署的应用,查询minikube的ip地址:
在这里插入图片描述
可以看到minikube的ip是192.168.64.26,直接访问:
在这里插入图片描述

5. 总结

本文我们通过组合理论篇所学习到的组件,通过一个 Node.js 网页应用连接 MongoDB 的例子,实现了在 k8s 中部署使用。虽然在本机环境下用 minikube 会显得比 Docker Compose 要麻烦的多,但只要我们上了集群,就可以凸显出 k8s 的强大之处了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一百零八天学习记录:C++基础:文件操作

C中对文件操作需要包含头文件<fstream> 操作文件的三大类&#xff1a; 1、ofstream:写擦破自评 2、ifstream:读操作 3、fstream:读写操作 文本文件 写文件 写文件步骤如下&#xff1a; 1、包含头文件 #include <fstream>2、创建流对象 ofstream ofs; 3、打开文…

Vue2笔记

Vue2 前端 语雀 (yuque.com) vue3: https://github.com/Panyue-genkiyo/vue3-learning vue2依据脚手架:https://github.com/Panyue-genkiyo/vue-advance vue基础不依赖脚手架:https://github.com/Panyue-genkiyo/vue-learning Vue 是一套用于构建用户界面的 渐进式框框架…

B2B2C多用户商城软件功能清单

多用户B2B2C是如今企业搭建电商平台比较火热模式&#xff0c;B2B2C包含了B2B与B2C这两者模式的特点&#xff0c;是非常具有发展前景的商城系统&#xff0c;那么一个完善的多用户B2B2C商城系统应该包含哪些主要功能呢?加速度jsudo一起来看看吧! 商品模块功能&#xff1a; 包括…

【深度剖析】 堆排序为什么不稳定?!

文章目录 零、前言一、什么是稳定性&#xff1f;二、不稳定的地方在哪里&#xff1f; 零、前言 最近做面试题中&#xff0c;遇到一些平时学习中比较少注意到的问题&#xff0c;记录下来以便后来者学习讨论。 对 堆排序 不熟悉的 可以参考 &#x1f449;&#x1f449;&#x1f4…

TortoiseGit 入门指南07:创建分支

Git 的 分支 出了名的好用。其它的版本控制系统也提供分支&#xff0c;但在易用度上&#xff0c;只有两类版本控制系统&#xff1a;一种是 Git&#xff0c;一种是其它。 Bob 大叔在《匠艺整洁之道》中写道&#xff1a; 我曾经坚持拒绝分支。在使用 CVS 和 Subversion 的时候&a…

检测到目标X-Content-Type-Options响应头缺失

详细描述 X-Content-Type-Options HTTP 消息头相当于一个提示标志&#xff0c;被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定&#xff0c;而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为&#xff0c;换句话说&#xff0c;也就是意味…

Dynamic-SLAM2019论文翻译

Dynamic-SLAM:动态环境下基于深度学习的语义单目视觉定位与建图 摘要-传统SLAM框架在动态环境下工作时&#xff0c;由于受到动态对象的干扰&#xff0c;性能较差。为了解决动态环境下的SLAM问题&#xff0c;利用深度学习在目标检测中的优势&#xff0c;提出了一种语义同步定位…

Science Advances|上海交大王风平团队揭示深古菌与早期地球协同演化历史

Research Article&#xff0c;2023-7-5&#xff0c;Science Advances&#xff0c; [IF 13.6] 原文链接&#xff1a;https://www.science.org/doi/full/10.1126/sciadv.adf5069 第一作者&#xff1a;侯佳林 通讯作者&#xff1a;王风平&#xff0c;王寅炤 - 摘要 - 近日&#xf…

C++——友元

友元的定义 C 中的友元&#xff08;friend&#xff09;是一种允许非成员函数或类访问另一个类的私有或保护成员的机制。友元可以是一个普通的非成员函数、另一个类或整个类的所有成员函数。 什么情况下需要友元 现在尝试去重载operator<<&#xff0c;然后发现没办法将o…

vscode 配置ssh 免密登录 多台服务器

0、下载vscode Visual Studio Code - Code Editing. Redefined 之前一直用pycharm 但是好像社区免费版本不能连接服务器&#xff0c;还要本地同步代码&#xff0c;比较繁琐&#xff0c;因此改用vscode。 1、添加ssh 添加后可以尝试登录&#xff0c;确认下账号密码&#xff0…

linux提权总结

文章目录 常用命令反弹shell获取完整交互式SHELLLinux内核漏洞提权脏牛提权 CVE-2016-5195metasploit linux提权SUID提权passwd提权ssh密钥提权环境变量劫持提权john破解root密文计划任务提权(cron Jobs)提权脚本LinEnumlinux-exploit-suggester2linuxprivchecker docker逃逸提…

Windows 10 + WSL 2 + Ubuntu 22.04 搭建 AI 环境

参考 Enable NVIDIA CUDA on WSL 在WSL里的Ubuntu 22.04中进行以下操作前&#xff0c;请先在 Windows 10 中安装好 Nvidia驱动程序 和 CUDA Toolkit 11.7 &#xff0c;并将 cuDNN 下载后的文件复制到对应目录中 安装 Conda 23.5.2 wget https://repo.anaconda.com/archive/An…

代码随想录算法训练营第十八天 | 动态规划系列1,2,3,4

动态规划系列1,2,3,4 动态规划理论基础重点 509 斐波那契数未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 70 爬楼梯未看解答自己编写的青春版思考后自己写的代码重点代码随想录的代码我的代码(当天晚上理解后自己编写) 746 使用最小花费爬楼…

职责链模式:如何实现可灵活扩展算法的敏感信息过滤框架?

今天&#xff0c;我们主要讲解职责链模式的原理和实现。除此之外&#xff0c;我还会利用职责链模式&#xff0c;带你实现一个可以灵活扩展算法的敏感词过滤框架。下一节课&#xff0c;我们会更加贴近实战&#xff0c;通过剖析Servlet Filter、Spring Interceptor来看&#xff0…

从零开始的python入门之路

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

c语言播放MP3音乐

今天学习了一下怎么用c语言播放音乐的方法&#xff0c;为了防止忘记&#xff0c;特此记录一下&#xff0c;首先就是把要播放的mp3文件保存到和要编辑的.c文件同一个目录中&#xff0c;如图所示&#xff1a; 下面就直接看代码吧&#xff1a; #include<stdio.h> #include&…

线程中并发安全问题(Sychronized关键字的底层原理)

线程中并发安全问题 Sychronized关键字的底层原理 ​ sychronized对象锁采用互斥方式让同一时刻至多只有一个线程能持有对象锁&#xff0c;其他线程想获取这个对象锁只能被阻塞。 Monitor Sychronized的底层实现Monitor。 WaitSet&#xff1a;关联调用了wait方法的线程&a…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法&#xff0c;以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好&#xff1a; 其相比于基于补丁…

【板栗糖GIS】——buzz字幕软件的安装和使用

【板栗糖GIS】——buzz字幕软件的安装和使用 1. 下载buzz软件 链接如下&#xff1a; 下载软件包&#xff0c;我已经准备好资源&#xff0c;只是审核还未通过&#xff0c;过两天会加上&#xff0c;忘记补充链接可以私信我 2. 双击安装 直接下一步下一步 3. 使用方法介绍 运…

并发事务会有哪些问题?

并发事务会有哪些问题&#xff1f; 多个事务并发的执行一定会出现相互争夺资源的问题。那么问题具体有哪些呢&#xff1f; 脏写&#xff08;丢失修改&#xff09;脏读不可重复读幻读 以上这四个问题就是我们需要知道的。但是脏写&#xff0c;由于mysql最低的隔离级别都能避免…