K8S系列文章之 使用Kind部署K8S 并发布服务

news2024/11/24 6:57:17

简单介绍

kind 即 Kubernetes In Docker,顾名思义,就是将 k8s 所需要的所有组件,全部部署在一个docker容器中,是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用,但是如果你只是想在本地简单的玩玩 k8s,不想占用太多的资源,那么使用 kind 是你不错的选择。同样,kind 还可以很方便的帮你本地的 k8s 源代码打成对应的镜像,方便测试。

使用kind

在一台 centos 上简单尝试一下 kind,前提是必须要安装好 docker 和 kubectl。

wget https://github.com/kubernetes-sigs/kind/releases/download/0.2.1/kind-linux-amd64
mv kind-linux-amd64 kind
chmod +x kind
mv kind /usr/local/bin

安装完成之后,我们来看看 kind 有哪些命令。

build 用来从 k8s source 构建一个镜像。

create、delete 创建、删除集群。

export 命令目前只有一个 logs 选项,作用是将内部所有容器的日志拷贝到宿主机的某个目录下。

get 查看当前有哪些集群,哪些节点,以及 kubectl 配置文件的地址

load 可以从宿主机向 k8s 容器内导入镜像。

[root@node-2 ~]# kind
kind creates and manages local Kubernetes clusters using Docker container 'nodes'

Usage:
  kind [command]

Available Commands:
  build       Build one of [base-image, node-image]
  create      Creates one of [cluster]
  delete      Deletes one of [cluster]
  export      exports one of [logs]
  get         Gets one of [clusters, nodes, kubeconfig-path]
  help        Help about any command
  load        Loads images into nodes
  version     prints the kind CLI version

Flags:
  -h, --help              help for kind
      --loglevel string   logrus log level [panic, fatal, error, warning, info, debug] (default "warning")
      --version           version for kind

Use "kind [command] --help" for more information about a command.

下面来以最简单的方式安装一个集群

注意点 需要单独下载一个kubectl 不然无法操作 kubectl 等相关命令 

[root@node-2 ~]# kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.13.4)  
 ✓ Preparing nodes   
 ✓ Creating kubeadm config   
 ✓ Starting control-plane  ️ 
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info

[root@node-2 ~]# export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
[root@node-2 ~]# kubectl cluster-info
Kubernetes master is running at https://localhost:39284
KubeDNS is running at https://localhost:39284/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@node-2 ~]# kubectl get node
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   99s   v1.13.4

使用 kind create cluster 安装,是没有指定任何配置文件的安装方式。从安装打印出的输出来看,分为4步:

  1. 查看本地上是否存在一个基础的安装镜像,默认是 kindest/node:v1.13.4,这个镜像里面包含了需要安装的所有东西,包括了 kubectl、kubeadm、kubelet 二进制文件,以及安装对应版本 k8s 所需要的镜像,都以 tar 压缩包的形式放在镜像内的一个路径下
  2. 准备你的 node,这里就是做一些启动容器、解压镜像之类的工作
  3. 生成对应的 kubeadm 的配置,之后通过 kubeadm 安装,安装之后还会做另外的一些操作,比如像我刚才仅安装单节点的集群,会帮你删掉 master 节点上的污点,否则对于没有容忍的 pod 无法部署。
  4. 启动完毕

查看当前集群的运行情况

[root@node-2 ~]# kubectl get po -n kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-6g66f                     1/1     Running   0          21m
coredns-86c58d9df4-pqcc4                     1/1     Running   0          21m
etcd-kind-control-plane                      1/1     Running   0          20m
kube-apiserver-kind-control-plane            1/1     Running   0          20m
kube-controller-manager-kind-control-plane   1/1     Running   0          20m
kube-proxy-cjgnt                             1/1     Running   0          21m
kube-scheduler-kind-control-plane            1/1     Running   0          21m
weave-net-ls2v8                              2/2     Running   1          21m

默认方式启动的节点类型是 control-plane 类型,包含了所有的组件。包括2 * coredns、etcd、api-server、controller-manager、kube-proxy、sheduler,网络插件方面默认使用的是 weave,且目前只支持 weave,不支持其他配置,如果需要可以修改 kind 代码进行定制。

基本上,kind 的所有秘密都在那个基础镜像中。下面是基础容器内部的 /kind 目录,在 bin 目录下安装了 kubelet、kubeadm、kubectl 这些二进制文件,images 下面是镜像的 tar 包,kind 在启动基础镜像后会执行一遍 docker load 操作将这些 tar 包导入。manifests 下面是 weave 的 cni。

root@kind-control-plane:/kind# ls
bin  images  kubeadm.conf  manifests  systemd  version

root@kind-control-plane:/kind# ls bin/
kubeadm  kubectl  kubelet

root@kind-control-plane:/kind# ls images/
4.tar  6.tar  8.tar               kube-controller-manager.tar  kube-scheduler.tar
5.tar  7.tar  kube-apiserver.tar  kube-proxy.tar

root@kind-control-plane:/kind# ls manifests/
default-cni.yaml

root@kind-control-plane:/kind# ls systemd/
10-kubeadm.conf  kubelet.service

创建多节点的集群

默认安装的集群只带上了一个控制节点,下面重新创建一个两节点的集群。配置文件如下,在 node 中可以配置的不是很多,除了 role 另外的可以更改 node 使用的镜像,不过我这边还是使用默认的镜像。

apiVersion: kind.sigs.k8s.io/v1alpha3
kind: Cluster
nodes:
  - role: control-plane
  - role: worker

还是使用命令安装

[root@node-2 ~]# kind create cluster --config=kind-config.yaml 
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.13.4)  
 ✓ Preparing nodes    
 ✓ Creating kubeadm config   
 ✓ Starting control-plane  ️ 
 ✓ Joining worker nodes   
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info

[root@node-2 ~]# kubectl get nodes
NAME                 STATUS   ROLES    AGE     VERSION
kind-control-plane   Ready    master   3m20s   v1.13.4
kind-worker          Ready    <none>   3m8s    v1.13.4

[root@node-2 ~]# kubectl get po -n kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-cnqhc                     1/1     Running   0          5m29s
coredns-86c58d9df4-hn9mv                     1/1     Running   0          5m29s
etcd-kind-control-plane                      1/1     Running   0          4m24s
kube-apiserver-kind-control-plane            1/1     Running   0          4m17s
kube-controller-manager-kind-control-plane   1/1     Running   0          4m21s
kube-proxy-8t4xt                             1/1     Running   0          5m27s
kube-proxy-skd5v                             1/1     Running   0          5m29s
kube-scheduler-kind-control-plane            1/1     Running   0          4m18s
weave-net-nmfq2                              2/2     Running   1          5m27s
weave-net-srdfw                              2/2     Running   0          5m29s

大功告成,一套测试集群很轻松就搭建完成啦。

官网链接

建议安装最新版本的 支持部署最新K8S的版本

下面这个是最新版本能支持部署的K8S版本

 

我们采用的是 K8S In Docker 模式,外部如何访问容器内的K8S集群服务呢?

 

实战步骤

1. 重建K8s,暴露80、443端口

在上一节中,我们介绍过用kind创建K8s时,是相当在本地运行了一个容器,而K8s Cluster就运行在这个容器中。

所以,如果我们想从外部访问kind K8s的话,就需要把这个容器的端口(K8s的端口)暴露出来。

目前可以看到只有38325这个端口可以从外部访问

为了下一步测试,我们重新创建一个新的K8s cluster并且把80和443端口暴露出来。

运行下列命令删除现在的k8s cluster

kind delete cluster --name tsk8s

运行下列命令创建新的k8s cluster

cat <<EOF | kind create cluster --name tsk8s --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
  - containerPort: 30000
    hostPort: 30000
    protocol: TCP
EOF

说明:

  • extraPortMappings:把K8s容器(相当于K8s所在的服务器)端口暴露出来,这里暴露了80、443、30000
  • node-labels:只允许Ingress controller运行在有"ingress-ready=true"标签的node上

运行结果

这时可以看到80、443、30000端口已经暴露出来了

注意:如果是在公司代理环境下,我们要在K8s容器中设置代理,才可以正常进行下面的测试,设置代理请参考上一篇文章《代理环境下在WSL2中用Kind创建Kubernetes集群》”

2. 部署Deployment、Service

部署Deployment

新建文件my-dep.yaml,添加以下内容

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-dep
spec:
  replicas: 1  # number of replicas of frontEnd application
  selector:
    matchLabels:
      app: httpd-app
  template:
    metadata:
      labels: # Must match 'Service' and 'Deployment' labels
        app: httpd-app
    spec:
      containers:
      - name: httpd
        image: httpd # docker image of frontend application
        ports:
        - containerPort: 80

说明:

  • Deployment的名称为“httpd-dep”
  • 管理的Pods需要带有“app: httpd-app”标签
  • Pod模板中指定运行的镜像为 Docker 公共仓库中的httpd

运行以下命令创建Deployment

kubectl apply -f my-dep.yaml

创建Deployment结果

查看新建的Pod,-o wide可以看到更多的信息

kubectl get pods -o wide

说明:可以看到Pod被分配了一个K8s内部IP,这个IP不能从K8s外部访问到,而且这个IP在Pod重建后会变化

部署Service

新建文件my-svc.yaml,添加以下内容

kind: Service
apiVersion: v1
metadata:
  name: httpd-svc
spec:
  selector:
      app: httpd-app
  ports:
  - port: 80

运行以下命令创建Service

kubectl apply -f my-svc.yaml

创建Service结果

查看Service信息

kubectl get svc/httpd-svc

说明:Service的IP是不会变化的(除非重建Service)

查看Service详细信息

kubectl describe svc/httpd-svc

说明:

可以看到这里Service关联的Endpoint的IP和端口就是上面Pod的IP和端口。每次Pod重建后这里的Endpoint就会刷新为新的IP。

目前这个Service只有内部IP和端口,所以这个Service还只能用在K8s内部暴露Pods。

下面我们修改Service配置,使用K8s外部也可以访问到这个Service

更改Serivce(nodePort)

修改my-svc.yaml,添加以下内容

kind: Service
apiVersion: v1
metadata:
  name: httpd-svc
spec:
  selector:
      app: httpd-app
  type: NodePort #1
  ports:
  - port: 80
    nodePort: 30000 #2

说明:

  • #1 Service type默认为ClusterIP,即只有内部IP。改为NodePort后,Service会把K8s内部的端口映射到集群所在的服务器上
  • #2 指定Service映射到服务器上的端口为30000

再次运行 kubectl apply 命令

运行结果

再次查看Service信息,可以看到端口中多了一个30000

30000这个端口被映射到了K8s集群所在的服务器上(即K8s运行的容器),而我们在创建kind K8s时把容器的30000端口又映射到本地,所以现在我们可以在本地用浏览器访问30000端口。

在本地可以访问到30000端口上的httpd应用

引申


除了用NodePort暴露服务,我们还可以用ingress/ingress controller实现相同的功能。我们将在下一篇文章中测试ingress/ingress controller

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

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

相关文章

从零开始学Python(Ⅰ)基本变量与数据类型

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Python的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.关于Python的基本知识&#xff08;变量…

python爬虫之scrapy框架介绍

一、Scrapy框架简介 Scrapy 是一个开源的 Python 库和框架&#xff0c;用于从网站上提取数据。它为自从网站爬取数据而设计&#xff0c;也可以用于数据挖掘和信息处理。Scrapy 可以从互联网上自动爬取数据&#xff0c;并将其存储在本地或在 Internet 上进行处理。Scrapy 的目标…

ffmpeg+nginx实现rtsp协议摄像头web端播放

ffmpegnginx实现rtsp协议摄像头web端播放 环境准备准备nginx环境添加rtmp模块添加hls转发 使用ffmpeg&#xff0c;将摄像头rtsp转为rtmp并推送到nginxVLC播放验证 环境准备 nginx&#xff08;需要安装rtmp模块&#xff09;ffmpeg 6.0vlc播放器&#xff08;本地播放验证&#x…

这个酒店管理方法太酷了!赶紧试试吧

安全是酒店管理中最重要的优先事项之一&#xff0c;酒店保障住客和员工的生命安全是不可妥协的责任。为了有效预防和应对潜在的火灾风险&#xff0c;引入烟感监控系统是一种普遍且高效的解决方案。 烟感监控系统通过及时检测烟雾和火源&#xff0c;及时发出警报和采取措施&…

Nacos单点部署

文章目录 一、Nacos概述二、部署Nacos&#xff08;1&#xff09;容器部署 三、注册服务四、整合外部的Mysql&#xff08;单节点&#xff09; 一、Nacos概述 Nacos是什么&#xff1f; Nacos的全称是Dynamic Naming and Configuration Service&#xff0c;是阿里巴巴推出来的一个…

系统函数和状态方程的转换

1.问题介绍 之前碰到这样一个问题&#xff1a;给定一个正弦信号以及系统传递函数&#xff0c;利用该系统传递函数进行卡尔曼滤波。 利用卡尔曼进行滤波首先要知道系统的状态方程&#xff0c;那么题目只给了系统传递函数&#xff0c;如何能够得到状态方程呢&#xff1f; 首先…

C++ 多线程:std::future

std::future std::future 简介示例1博客引用来源 std::future 简介 我们前面介绍的std::thread 是C11中提供异步创建多线程的工具&#xff0c;只能是异步运行任务&#xff0c;却无法获取任务执行的结果&#xff0c;一般都是依靠全局对象&#xff0c;全局对象在多线程下是及其不…

Python连接Hive实例教程

一 Python连接hive环境实例 经在网络查询相关的教程&#xff0c;发现有好多的例子&#xff0c;发现连接底层用的的驱动基本都是pyhive和pyhs2两种第三方库的来连接的 hive,下面将简介windows 10 python 3.10 连接hive的驱动程序方式&#xff0c;开发工具&#xff1a;pycharm …

API接口统一管理

API接口统一管理 在开发项目的时候,接口可能很多需要统一管理。在src目录下去创建api文件夹去统一管理项目的接口&#xff1b;这样便于后期维护和团队开发。 axios二次封装 对于axios不熟悉的话&#xff0c;建议先学习这篇文章:Axios的基本使用 在开发项目的时候避免不了与后…

日销千单!TikTok Shop正成为部分东南亚卖家的首选平台...

TikTok Shop 正在成为一些东南亚卖家首选的电商平台&#xff0c;凭借娱乐购物模式获得年轻消费者青睐&#xff0c;他们已经可以通过该平台实现日销 5000 单。 作为字节跳动旗下全球短视频平台&#xff0c;TikTok 的电商功能可能会撼动这个拥有 6.7 亿人口、目前由 Shopee、Laz…

[Docker实现测试部署CI/CD----构建成功后钉钉告警(7)]

目录 15、钉钉告警创建项目群&#xff0c;然后添加机器人添加机器人Jenkins 系统配置项目配置修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 不修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 15、钉钉告警 创建项目群&#xff0c;然后添加机器人 首先需要在钉…

探索Python数据容器之乐趣:列表与元组的奇妙旅程!

文章目录 零 数据容器入门一 数据容器&#xff1a;list(列表)1.1 列表的定义1.2 列表的下表索引1.3 列表的常用操作1.3.1 列表的查询功能1.3.2 列表的修改功能1.3.3 列表常用方法总结 1.4 补充&#xff1a;append与extend对比1.5 list&#xff08;列表&#xff09;的遍历1.6 补…

浏览器同源策略

浏览器同源策略 同源策略&#xff1a;是一个重要的浏览器的安全策略&#xff0c;用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介 例如&#xff1a;被钓鱼网站收集信息&#xff0c;使用ajax发起…

MongoDB 入门

1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据&#xff1f; 数据&#xff08;英语&#xff1a;data&#xff09;&#xff0c;是指未经过处理的原始记录。 一般而言&#xff0c;数据缺乏组织及分类&#xff0c;无法明确的表达事物代表的意…

基于IMU和超声的3D手势识别笔

随着科技的发展&#xff0c;人机交互在商业中有了越来越多的应用。面对日益复杂的交互场景&#xff0c;手势识别逐渐成为虚拟现实等相关应用的主要交互手段。 3D手势识别是一个具有挑战性的问题&#xff0c;常用的手势传感器有三种基本类型&#xff1a;多点触摸屏传感器、基于视…

深度学习常用的激活函数

深度学习的核心思想是通过多层次的神经网络结构&#xff0c;逐步抽取和表示数据中的高级特征&#xff0c;从而实现对复杂数据模式的学习和识别。 神经网络结构&#xff1a; 深度学习使用多层次的神经网络&#xff0c;包括输入层、隐藏层和输出层。这些网络结构允许模型自动学习…

FineBI 人力资源 专题

此处使用FineBI处理人力资源数据&#xff0c;数据来源于HR_database数据文件&#xff0c;将此文件拷贝到安装目录下 然后配置数据库连接 在【公共数据】中新建一个文件夹&#xff0c;并将之前数据库中需要用到的表放入此处&#xff0c;更新数据。显示如下。 这时候首先要建立…

汽配企业如何利用MES管理系统解决生产防错难题

汽车配件制造业是一个高效率、低成本、高质量的生产领域&#xff0c;但同时也面临着一系列的挑战。其中最为突出的挑战之一是如何在生产过程中避免错误&#xff0c;提高产品的合格率。本文将介绍汽车配件的制造特点以及如何通过MES管理系统解决方案实现生产防错&#xff0c;从而…

企业如何实现自己的AI垂直大模型

文章目录 为什么要训练垂直大模型训练垂直大模型有许多潜在的好处训练垂直大模型也存在一些挑战 企业如何实现自己的AI垂直大模型1.确定需求2.收集数据3.准备数据4.训练模型5.评估模型6.部署模型 如何高效实现垂直大模型 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页…

【C++11】右值引用 | 移动语义

文章目录 一.基本概念1.左值 && 右值2.左值引用 && 右值引用 二.右值引用使用场景和意义1.左值引用的使用场景2.左值引用的短板3.右值引用和移动语义4.右值引用引用左值5.右值引用的其他使用场景 三.完美转发1.万能引用2.完美转发保持值的属性3.完美转发的使用…