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

简单介绍

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 commandload        Loads images into nodesversion     prints the kind CLI versionFlags:-h, --help              help for kind--loglevel string   logrus log level [panic, fatal, error, warning, info, debug] (default "warning")--version           version for kindUse "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/proxyTo 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  versionroot@kind-control-plane:/kind# ls bin/
kubeadm  kubectl  kubeletroot@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.tarroot@kind-control-plane:/kind# ls manifests/
default-cni.yamlroot@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 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-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 80hostPort: 80protocol: TCP- containerPort: 443hostPort: 443protocol: TCP- containerPort: 30000hostPort: 30000protocol: 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 applicationselector:matchLabels:app: httpd-apptemplate:metadata:labels: # Must match 'Service' and 'Deployment' labelsapp: httpd-appspec:containers:- name: httpdimage: httpd # docker image of frontend applicationports:- 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-appports:- 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-apptype: NodePort #1ports:- port: 80nodePort: 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.mzph.cn/news/23772.shtml

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

相关文章

队列中offer,add;poll,remove;peek,element之间的区别

offer和add的区别 offer() 和 add() 都是向队列中加入新项。 一些队列有大小限制&#xff0c;因此如果想在一个满的队列中加入一个新项&#xff0c;多出的项就会被拒绝。 这时新的offer方法就可以起作用了。它不是对调用add()方法抛出一个unchecked异常&#xff0c;而只是得…

初阶C语言——特别详细地介绍函数

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 目录 系列文章目录 前言 一、函数是个什么鬼东西&#xff1f; 二、C语…

css中的bfc是什么?

什么bfc&#xff1f; BFC&#xff08;Block Formatting Context&#xff09;块级 格式化 上下文。 BFC就是页面上的一个隔离的独立盒子&#xff0c;容器里面的子元素和外面的元素不会相互影响。 为什么要bfc? bfc是我们去主动触发的,并不是自动就存在的,它是帮助我们解决cs…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

openSUSE安装虚拟化 qemu kvm

1) 第一种&#xff1a;图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装&#xff0c;是不是很简单呢 2&#xff09;第二种&#xff1a; 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少&#xff0c;可以搜索centos7 安装qemu kvm的教程&#xff0c;然后…

ZAFUACM - 23.8.5个人赛补题

文章目录 A - Lucky Conversion题意思路代码 B - Constanzes Machine题意思路代码 C - Maximum Median题意思路代码 D - Remove Extra One题意思路代码 E - A Determined Cleanup题意思路代码 F - Minimal k-covering A - Lucky Conversion 原题链接 题意 给出两个只包含“4…

vue-baidu-map-3x 使用记录

在 Vue3 TypeScript 项目中&#xff0c;为了采用 标签组件 的方式&#xff0c;使用百度地图组件&#xff0c;冲浪发现了一个开源库 ovo&#xff0c;很方便&#xff01;喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本&#xff08;支持v2.0、v…

《面试1v1》ElasticSearch 和 Lucene

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

DLA 神经网络的极限训练方法:gradient checkpointing

gradient checkpointing 一般来说&#xff0c;训练的过程需要保存中间结果&#xff08;不管是GPU还是CPU&#xff09;。前向传播根据输入(bottom_data)计算输出(top_data)&#xff0c;后向传播由top_diff计算bottom_diff&#xff08;如果某个变量打开梯度进行训练的话&#xff…

5个顶级的开源有限元分析软件

每当我参加数值分析课程的教学时&#xff0c;都会回顾有限元方法的基础知识&#xff0c;很自然地就会出现使用哪种软件的问题。 以下讨论基于三个基本考虑&#xff1a; 在实际应用中&#xff0c;很少有人从头开始编写 FEM 代码。商业 FEM 软件通常在某些预定义的情况下非常易于…

Pandas操作Excel

Pandas 是 Python 语言的一个扩展程序库&#xff0c;用于数据分析。 菜鸟教程&#xff1a;https://www.runoob.com/pandas/pandas-tutorial.html 读取Excel pd.read_excel(path,sheet_name,header) path&#xff1a;excel文件路径sheet_name&#xff1a;读取的sheet&#xff0…

3.netty和protobuf

1.ChannelGroup可以免遍历由netty提供,覆盖remove方法即可触发删除channel\ 2.群聊私聊 13.群聊私聊简单原理图 3.netty心跳检测机制,客户端对服务器有没有读写(读,写空闲) //IdleStateHandler(3,5,7,TimeUnite.SECONDS)是netty提供的检测状态的处理器,也加到pipeline,读,写,…

浅析 C 语言的共用体、枚举和位域

前言 最近在尝试阅读一些系统库的源码&#xff0c;但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅&#xff0c;发现是 C 语言中的共用体和位域。于是&#xff0c;趁着课本还没有扔掉&#xff0c;将一些相关的知识点记录在本文。 文章目录 前言共用体 (union)枚举…

网络开发-IO模型

基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 用户进程空间<-->内核空间内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络I/O和磁盘…

【编程】典型题目:寻找数组第K大数(四种方法对比)

【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09; 文章目录 【编程】典型题目&#xff1a;寻找数组第K大数&#xff08;四种方法对比&#xff09;1. 题目2. 题解2.1 方法一&#xff1a;全局排序&#xff08;粗暴&#xff09;2.2 方法二&#…

123.买卖股票的最佳时机3

目录 一、题目 二、分析代码 一、题目 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 二、分析代码 class Solution { public:int maxProfit(vector<int>& prices) {//0表示没有操作//1表示第1次买入&#xff0c;2表示第1次卖出//3表示第2…

用html+javascript打造公文一键排版系统11:改进单一附件说明排版

一、用htmljavascript打造公文一键排版系统10中的一个bug 在 用htmljavascript打造公文一键排版系统10&#xff1a;单一附件说明排版 中&#xff0c;我们对附件说明的排版函数是&#xff1a; function setAtttDescFmt(p) {var t p;var a ;if (-1 ! t.indexOf(:))//是半角冒…

学习源码,模仿编程

一.观察者模式: 1.创建事件 2.发布事件 3.监听事件 4.效果: 二.模板方法模式