云原生学习之旅(1)- 本地Kubernetes环境搭建指南

发表时间: 2023-11-21 09:53

我这个类目《一起学云原生》,将逐步去探究云原生的搭建,实战技能,以及底层原理

什么是云原生

【云原生起源】

1.云计算的崛起:随着云计算技术的发展,企业开始将应用程序和服务迁移到云平台上。云计算提

供了弹性、可伸缩、按需付费等优势,但同时也带来了新的挑战,需要采用新的方法来充分利用这些优势。

2.容器技术的兴起:Docker等容器技术的出现使得应用程序能够以一致的方式在不同环境中运行。

这为构建和部署可移植的应用程序提供了便利。

3.微服务架构的普及:微服务架构提倡将应用程序拆分为小的、独立的服务,这有助于提高灵活

性、可维护性和可扩展性。

4.新兴技术的涌现:随着新技术的不断涌现,如容器编排工具(例如Kubernetes)、服务网格、持

续集成和持续交付(CI/CD)工具等,云原生生态系统逐渐形成。


云原生定义

云原生是一种软件开发和部署方法论,强调在云环境中构建和运行应用程序的原生优势。它包括以下关键特征:

1.容器化:应用程序及其依赖项被封装到容器中,确保在不同环境中的一致性和可移植性。

2.编排:使用容器编排工具管理和协调大规模容器化应用程序的部署、扩展和维护。

3.微服务架构:应用程序被拆分成小的、独立的服务,每个服务专注于特定的业务功能。

4.自动化:利用自动化工具和流程,包括CI/CD,以加速开发、测试和部署流程。

5.弹性和可伸缩性:应用程序设计为能够自动适应变化的负载,并能够在需要时扩展或收缩。

6.日志和监控:使用日志记录和监控工具,实时了解应用程序的性能和健康状况。

7.服务网格:通过服务网格来管理和监控微!↓之间的通信,提高服务之间的可见性和控制。

我们回想一下什么是云计算,就是云厂商将服务器物理资源搭建成云平台,提供给用户以云端操作系统以及一些云服务,我们可以选择是要windows还是linux,cpu内存带宽的规格,就可以直接获取一个远程操作系统;或者中间件,我们选择mysql版本容量规格,就可以直接获取一个远程的数据库。

那么我们可以把云原生简单理解为一种分布式的应用部署和管理平台,你只需要把你的应用镜像提供出来(容器化),并且配置好副本数,伸缩策略,服务端口等配置,那么云原生平台就可以把你的应用非常方便的部署上来,并且能运行时管理,自动伸缩,负载均衡,对外服务

落到实际,其实要学习云原生,绕不开的几个东西: K8S、CICD,而且通常是要组合在一起进行实施的,那我们可以先从K8S开始入手

搭k8s环境有哪些方法

我们知道要搭一个生产级别的k8s环境需要有多台主机,需要master节点,node节点。那适合开发和测试的k8s环境,主要可以通过Minikube 或者 dockerdesk 来进行,实际上搭建了一个单体型的k8s,但是对于学习和体验k8s的功能已经足够了

先来汇总说一下都有哪些方法。

  • docker desktop (单机本地,windows, 自带docker环境+k8s)
  • minikube (单机本地,windows/linux , 本地也需要docker)
  • 跑多个linux虚拟机来实际搭建k8s集群(要求电脑的配置足够高)
  • 用云服务器来搭建(要钱)
  • 用云厂商的k8s服务(要钱)

其实个人更推荐docker desk的方式,因为它本身是windows上的docker工具,在此基础上提供了k8s的套件,只需要简单的安装就可以直接使用

docker desktop

  • 安装 Docker Desktop:

Windows: Docker Desktop for Windows

https://hub.docker.com/editions/community/docker-ce-desktop-windows

macOS: Docker Desktop for Mac

https://hub.docker.com/editions/community/docker-ce-desktop-mac

具体安装过程就像安装一个普通的exe程序一样,不过多赘述,如果遇到问题可以评论区留言

  • 使用 Docker Desktop:

一旦 Docker Desktop 安装并运行,你可以使用 Docker 命令行工具或 Docker Desktop 用户界面来管理容器和服务。

  • 使用 Docker Desktop 用户界面

分为镜像管理和容器管理,可以对本地的docker以界面形式操作

  • 使用windows的CMD可以直接执行docker指令

  • 开启docker desktop的k8s

本地docker 会拉起很多k8s组件

  • 查看本地k8s集群信息

  • 部署一个简单的nginx应用到k8s

按我们之前讲到的,我们的应用想要部署到k8s,就必须先进行容器化(docker或者Containerd , k8s新版将不支持docker管理命令,但是docker制作的镜像还是能用的),我这里先尝试用已经存在的镜像 nginx ,来实验一下本地k8s的环境

k8s使用yaml脚本来定义应用的配置,我们这里先简单配置一个nginx应用

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:latest        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  name: nginx-servicespec:  selector:    app: nginx  ports:    - protocol: TCP      port: 88      targetPort: 80      nodePort: 30008  type: NodePort

以上配置定义了一个nginx应用,并且使用了 Deployment 和 Service 两个组件,这也是k8s最常用的两个。

Deployment:定义了应用的部署阶段的配置,比如副本数,镜像地址,应用内部端口等重要信息

Service:定义了应用在内部访问阶段的配置,比如访问形式,分为 ClusterIP(集群IP)、NodePort(节点端口)、LoadBalancer(负载均衡器) 。

ClusterIP 是默认和最常见的服务类型。

Kubernetes 会为 ClusterIP 服务分配一个集群内部 IP 地址。 这使得服务只能在集群内访问。您不能从集群外部向服务(pods)发出请求。

您可以选择在服务定义文件中设置集群 IP。

NodePort 服务是 ClusterIP 服务的扩展。 NodePort服务路由到的 ClusterIP 服务会自动创建。

它通过在 ClusterIP 之上添加一个集群范围的端口来公开集群外部的服务。

NodePort 在静态端口(NodePort)上公开每个节点 IP 上的服务。每个节点将该端口代理到您的服务中。因此,外部流量可以访问每个节点上的固定端口。这意味着对该端口上的集群的任何请求都会转发到该服务。

您可以通过请求 <NodeIP>:<NodePort> 从集群外部联系 NodePort 服务。

节点端口必须在 30000-32767 范围内。手动为服务分配端口是可选的。如果未定义,Kubernetes 会自动分配一个。

如果您要明确选择节点端口,请确保该端口尚未被其他服务使用。

LoadBalancer 服务是 NodePort 服务的扩展。 外部负载均衡器路由到的 NodePort 和 ClusterIP 服务是自动创建的。

它将 NodePort 与基于云的负载均衡器集成在一起。

它使用云厂商的负载均衡器在外部公开服务。

每个云厂商(AWS、Azure、GCP 、阿里云、腾讯云等)都有自己的原生负载均衡器实现。 云厂商将创建一个负载均衡器,然后它会自动将请求路由到您的 Kubernetes 服务。

来自外部负载均衡器的流量被定向到后端 Pod。 云厂商决定如何进行负载平衡。

负载均衡器的实际创建是异步发生的。

每次要向外界公开服务时,都必须创建一个新的 LoadBalancer 并获取 IP 地址。


我们本地测试,就可以直接用 NodePort , 用本地机器的某个端口号绑定, 来直接访问到Service的服务

编辑好k8s的yaml配置文件后,我们就可以进行部署了

kubectl apply -f d:\tmp\ng.yaml

然后可以执行命令查看部署情况

kubectl get pod -o wide

STATUS表示当前部署情况,我们之前副本数设置为3,可以看到这里有3个pod在进行部署,当所有POD状态都为RUNNING时表示我们的 Deployment 部分已经完成了

接下来我们看下 Service 的情况

kubectl get service

这里面Service我们用的是 NODEPORT,也就是绑定了我们本地30008端口,而CLUSTERIP集群IP 因为是用的本机desktop的k8s ,暂时无法直接访问

看下访问情况

我们部署的nginx能正常访问,本次简单的测试就已经Ok了。


后续我也将会持续整理k8s更多的文章,包括如何在实际环境中搭建集群,云厂商的负载均衡怎么接入,以及一些CICD工具平台的使用。