K3S+K3D=K8S 开发利器快速入门

序图

最近在做服务私有化建设这块,对于物理机能轻量化进行容器资源管理和对服务运维,k3s还是比较合适的。对于新鲜事物,作为非运维的我还是迫切想解并搞个demo出来尝尝鲜。

提示

本文是在没有K8S的基础上去了解和使用K3S,很多点都不会讲到,只是通过自己用到的demo来去理解K3S、K3D及K8S。我会将一些比较好的链接贴在恰当处,方便后续深入了解和使用。

什么是K3S

官网:https://k3s.io/
指南:https://rancher.com/docs/k3s/latest/en/
中文版指南:https://docs.rancher.cn/docs/k3s/_index/
K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化,易于安装,全部在不到100MB的二进制文件中;非常适合

  • Edge
  • IoT
  • CI
  • Development (用的就是这个)
  • ARM
  • Embedding K8s
  • Situations where a PhD in K8s clusterology is infeasible

可以理解为是K8SLite版,单词比K8S一半还少,所以叫K3S

什么是K3D

官网:https://k3d.io/v5.3.0/
指南:https://k3d.io/v5.3.0/usage/configfile/

k3d 是一个轻量级的包装器,用于在 docker 中运行k3s(Rancher Lab 的最小 Kubernetes 发行版)。
k3d 使得在 docker 中创建单节点和多节点k3s集群变得非常容易,例如在 Kubernetes 上进行本地开发。

对于我们研发人员,我们不希望花太多精力和时间去搭建和维护K8S,那么我们使用K3D就能通过类似docker的方式来快速的构建K3S集群,所以两者加起来就相当于一个K8S了。

安装

我的是mac,直接使用brew安装,K3D官网首页有各种系统的安装方式

brew install k3d

附:brew切换国内镜像
如下代表安装成功

k3d-version1.png

NodePort和Ingress的示例

到这里可能还是一脸懵逼的,因为涉及的点太多,也不知道从何下手,那就直接用一个demo来学习:使用集群部署一个可访问的服务,并在宿主机可以访问。
1、首先我们要知道使用k3d创建集群后,宿主机、k3d、k3s是怎样的关系,如下图

就把k3d理解为“docker”

2、使用k3d创建单节点集群架构
为了方便管理,这里使用yaml文件来创建集群,内容如下:

创建一个 server节点为1,agents节点为2的集群,且集群的30080端口映射宿主机的8087端口


附:非常详细的说明

接着我们使用命令k3d cluster create --config cluster.yaml 等待执行完成即可。

我们可以使用k3d cluster list来查看集群的状态,也可以通过kubectl get all --all-namespaces 来查看k3s集群中已经部署了资源

3、区别
nodeport和ingress分别属于k8s中供外部访问的两种方式,nodeport又是service资源的一种类型,其中service分为以下几种类型:

  • ClusterIp:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
  • NodePort:在ClusterlP基础上为Service在每台机器上绑定一个端口,这样就可以通过<NodeIP>:NodePort 来访问该服务
  • LoadBalancer:在NodePort的基础上,借助云厂商创建一个外部负载均衡器,并将请求转发到<NodeIP>:NodePort
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes1.7或更高版本的kube-dns才支持

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

https://kubernetes.io/zh/docs/concepts/services-networking/ingress/

简单的理解就是ingress可以使用域名对容器内的服务进行绑定,并且ingress controller可以动态的加载和更新域名与pod之间的映射关系

附:K8s之NodePort LoadBalancer和Ingress的区别

这里要多翻翻资料理解一下,刚开始还是比较难理解的。

4、NodePod
同样的,我们使用yaml来编写deployment和service

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
            memory: 256Mi
          requests:
            cpu: 80m
            memory: 128Mi
status: {}

重要的解释一下

  • kind:类型,deployment可以理解应用资源,service为访问规则资源,ingress即ingress配置资源
  • metadata.name: pod的名称,后续用于service绑定
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web-service
  name: app-service
spec:
  ports:
  - name: 
    nodePort: 30080
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: NodePort

  • spec.selector.app 指定当前service绑定的是哪一个pod
  • spec.type 指定当前的service为NodePort类型,默认为ClusterIp

这里有各种port,我画了个图帮助理解一下


接着我们使用kubectl apply -f xxx.yaml分别创建deployment和service

使用kubectl get pods,service -o wide 查看详细信息

到此我们就可以用宿主机直接访问localhost:8087了


5、Ingress
我们需要创建两组deployment、service和ingress,并且宿主机的hosts需要配置两个域名
我们先使用k3d cluster delete mycluster删除集群,再重建一个集群k3d cluster create --config cluster.yaml

deployment的声明保持不变,毕竟只是描述应用,改变的是service和新增ingress

apiVersion: v1
kind: Service
metadata:
  labels:
    app: web-service-a
  name: app-service-a
spec:
  ports:
  - name: 
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web-a

这里的service没有指定type,因为不需要节点暴露端口,只需要集群内访问ClusterIp

新增ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: app-ingress-a
spec:
  rules:
    - host: localhost # b的内容为localhost.k3d.ingress
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: app-service-a # 链接的是上面svc的名字
              port:
                number: 80

重点说明:

  • host: 即使用哪一个域名来访问service
  • backend.service.port.number 对应的是service的port

注意: 这里要注意一下, ingress默认端口是80,因为所以在整个k3d里,使用ingress的端口映射如下


所以对应的cluster.yaml里的映射也要改为- port: 9001:80 直接用我给的示例运行就行了

.
├── cluster.yaml
├── nginx-a.yaml
├── nginx-b.yaml
├── nginx-ingress-a.yaml
├── nginx-ingress-b.yaml
├── nginx-service-a.yaml
└── nginx-service-b.yaml

分别执行a和b


因为用的是同一个镜像,我们需要进入a和b的pod中更改nginx默认的html内容来区分


按照同样的方法,在b的实例中更改

接着需要更改我们的hosts文件,我用的是mac,直接在/etc/hosts 更改

127.0.0.1       localhost
127.0.0.1       localhost.k3d.ingress

最后可以访问验证了


Snipaste_2022-03-15_23-39-54.png

最后

想快速了解和学习某一技术,还是得需要拿示例来学习,通过以上我可以使用单机快速的来部署kubernetes集群,并且能编写yaml脚本去部署应用和访问,后续还需要继续了解kubernetes,最终能做到熟练使用吧。

示例代码:https://github.com/vector4wang/spring-boot-quick/tree/master/quick-container/src/main/k3s

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 前 言 前面的文章,我们都是围绕在k3s本身或是其关键的应用场景边缘计算中,阐述着相关内容。除了我们常提起的边缘...
    k3s中文社区阅读 2,169评论 0 2
  • 在学习本章前,请确保你已经掌握了Linux及docker的相关知识及操作 简介 Kubernetes(简称K8S)...
    索伦x阅读 16,455评论 3 31
  • k8s入门知识点 [TOC] k8s并不神秘,你可以结合vm和redis之类的中间件 Q-1:为什么需要k8s Q...
    LLyang碎碎念阅读 7,162评论 0 4
  • 简介 kubernetes简称k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。中文官网:https:/...
    Y了个J阅读 1,372评论 0 0
  • 背景简介 K8s & K3s 将外部流量引入群集有哪些不同方式,在何种场景选用那种方式,我们进行如下探讨: Nod...
    流雨声阅读 1,622评论 0 4