基于Kind的K8s开发环境配置

半日闲 2021年02月24日 42次浏览

前言
很难受!!!主要是没钱的原因!!!
作为一个平时总在弄k8s的人,k8s环境是少不了的,但是又到哪里去弄一套随时都可以用的环境呢?
3个方案,基本在脑海中初步成型

  1. 长期买云服务器
  2. 买1个二手服务器放家里,再买个公网IP盒子
  3. 把家里废弃的笔记本利用起来

先来说说第1个吧,在腾讯云,阿里云上不停的翻,1个月少不了也得300多,太贵,身为老百姓的我,搞不起,再看第2个,其实本来我在咸鱼上已经物色了很久了,但是无奈,后续用电很贵,搞个Dell R720,然后上个E5 2690的CPU,基本上1个小时就是300W往上,1个月,那不得也好几百,而且买个公网IP盒子,一个月也得30块,穷啊,只能再次Pass掉,只剩下第3个方案了,这个方案,也是在不停的实验中,终于成型了,用proxmox做底层,用zerotier做内网环境,用Nps做网络的灾备方案,用kind做k8s,基本上满足需求了!!!
本段前言是吐槽的,以下是干货!!!!!

方案

Proxmox的选择

作为远程访问的服务器来说,最重要的就是不可以宕机,即便是宕机,也要随时可以开机,因此我没有直接在家里的笔记上装Linux,而是在上面跑了个Proxmox,然后再在其中跑centos,这样主要是因为虚拟机的状态我随时可以控制,而且不管怎么操作,我都可以保证虚拟机可以正常的跑起来不会挂掉。

Zerotier的选择

本来最好的方式应该是VPN的,但是经过很多次实验,VPN总是搭建不起来,逐渐丧失了耐心,最后采用了备选方案Zerotier,但是后续居然惊喜的发现Zerotier在相同网络下的延迟特别短,而且网速也很快(这里说的相同网络,指的是移动,电信这种运营商级别的)

Nps的选择

其实有了Zerotier搭建的内网,网络基本上就可以访问了,但是为了保证任何情况下网络都可以通,而且延迟比较低,因此我还是在自己的云服务器上做了Nps,将Proxmox的8006端口映射到了公网,还有22端口也映射到了公网。其实Frp也可以,但是Nps主要是有Web界面,直接点就可以了,比较方便直观。

Kind的选择

这个主要是因为Proxmox是基于kvm的虚拟化,因此无法超售,我家里的笔记本是联想ThankPad E545 的,是2015年的产品了,很垃圾了,没办法跑多个虚拟机,因此组建不了K8s集群,只能使用备选方案Kind了
Harbor的选择——其实一开始选择的是Docker registry作为Image的存储的,因为Kind的官方教程钟使用的也是Docker registry,但是很尴尬的Docker registry的前端页面一直没搞起来,就没耐心了。。。。查了下资料,就改用Harbor了,后续使用显示,这个选择还真是改对了

环境搭建

Proxmox配置

官网下载Proxmox即可,地址如下
Proxmox下载
官网下载BalenaEther工具,地址如下
BalenaEther下载

去掉ProxmoxVE的订阅提示

image.png
修改如图文件的大概458行,将此处的if修改为false,如图所示,重启Proxmox即可(如何去掉订阅有很多种方式,修改底下的Ext.Msg.show函数也可以)

登录Proxmox

image.png
安装Proxmox的过程和正常安装系统一样,就不再介绍了,注意的是,中间设置设置密码的时候,设置成强密码,毕竟Proxmox如果被攻破了,就什么都凉了。安装结束后,在Web端口访问默认的8006端口,输入安装时的密码即可。

Proxmox开启Ssh

虽然可以从界面上访问Proxmox了,但是作为一个正常的运维人员来说,Ssh是必须有的,因此直接如下即可

systemctl start sshd && systemctl enable sshd

Proxmox是基于Debian的,因此和正常的操作Linux是一样的,在此,建议将Proxmox的Ssh登录设置为只允许密钥登录,从而保证安全。

Nps配置

Nps是一款支持Web界面的内网穿透工具,功能比较强大,现在也还没有研究透,官网如下
Nps官网
官网下载Server端和Client端即可

一,Server端配置

Nps的文档实际上是很全的,而且也都是中文,安装很简单,直接

nps start

运行成功后,登录Web界面,输入自定义的账号密码,如下
image.png
在客户端一栏中添加1个客户端即可
image.png
因为我用的比较简单,所以只填了个验证密钥和备注名而已,记住这个验证密钥,后续Client连接时候,需要用到

二,Client端配置

官网下载Client后,可以用命令直接连接,放在前台跑也行,如下

npc -server=1.2.3.4:8024 -vkey=Admin12345k8s

server字段填写Nps的访问IP和端口(Nps的默认端口是8024)
但是我是写了Systemd文件的,使用Systemd来管理,方便下,如下
image.png
然后重新Reload一下Systemd,如下

systemctl daemon-reload && systemctl restart npc && systemctl enable npc

如下,看到successful字样,即表示成功
image.png

三,界面查看,并增加端口映射

登录Nps界面验证下,可以看到如下
image.png
针对相应的客户端,增加端口映射,如下即可,根据提示填写即可,其中客户端ID可以在客户端栏看到
image.png
创建后,就是如下显示,可以看到某个端口的开放情况image.png
如上方法,将Proxmox的端口,还有Ssh的端口,统统映射出来(需要提醒的是,一旦放到公网,安全措施必须做足,默认端口,默认密码,密码强度都得做好

四,测试

测试如下,我对Ssh设置是只允许密钥登录,使用对应私钥,登录成功
image.png

Zerotier内网配置

官网下载如下,Win,Linux,Mac的客户端都有,可以说是很齐全的。以下是Linux的
安装命令

curl -s https://install.zerotier.com | sudo bash

官网在这里
Zerotier官网

一,登录官网,创建内网网络

点击创建即可,如下
image.png

二,配置内网

配置界面基本如下,可以配置网络是否是私有/公有,网络中网段范围,网络中DNS等,具体的大家登录下官网,注册下即可。可以看我我有6个设备加入到了该网络中,而且有5个设备是在线的
注意,请记住这里的Network ID,后续设备入网,需要用到
image.png
image.png
image.png

三,设备入网

在Linux执行以下命令,即可安装Zerotier,默认安装后,是自动开机启动的

curl -s https://install.zerotier.com | sudo bash

安装后如下
image.png
Linux设备加入网络,如下

zerotier-cli join xxxx
## xxxx表示上文中的Network ID

运行上述命令后,会提示200字样,即表示加入网络成功
登录官网,选择刚才创建后的Network,进入对加入的设备进行认证
当有新设备连接进入网络时候,需要在这个页面先认证才能加入我的网络,如下
image.png
点击红框中的对勾即可授权,点击红框中的+号,即可给该设备手动分配IP,也可以设置自动给设备分配IP,但是不推荐自动分配,因为,自动分配IP的话,你无法规划IP使用方案。
上述设备认证弄完,Zerotier就会将你分配的IP下发到该设备了

四,验证

IP验证

入网成功后,我们验证下,使用如下命令

ip a 
zerotier-cli listnetworks

查看如下,可以看到Zerotier的网卡的IP确实如上分配的一样,而且也可以看到加入的网络情况
image.png

登录验证

在Cmd中查看本机IP,然后Ping其他内网内的设备,如下
image.png
本机的Zerotier的内网IP是x.x.100.100,另1个内网IP是x.x.100.110,完全可以ping通,而且只有不到100ms的延迟

Harbor镜像仓库

Harbor是1个开源的企业级的镜像仓库,稳定可靠,还有界面,比较方便,因此就选它了。如下官网
Harbor的Github开源地址

一,安装

官网下载离线安装包即可,安装前的配置修改如下
image.png
修改下其中harbor.yml中的hostname,http端口,注释掉https,如果需要修改存储还需要data_volume和harbor_admin_password字段,如下
image.png
安装harbor如下

./install.sh  --with-chartmuseum
## 表示安装harbor的时候,开启chart仓库功能

二,验证

安装成功后,使用docker-compose可以查看运行情况,如下
image.png
所有的都显示healthy,即表示正常,使用docker login可以登录该harbor,但是由于我们启动的是http的Harbor,因此需要配置docker的insecure-registry字段,然后重启docker才可以,重启如下

systemctl daemon-reload && systemc restart docker

注意,harbor好像有个坑,因为harbor启动在前,而此时restart docker在后,因此,号要将harbor重启一下,再docker login才会成功,否则会报错,重启harbor,如下

doker-compose down && sleep 30 && docker-compose up -d && docker-compose ps
## 执行此命令,必须在harbor的安装目录下执行

使用docker login登录如下
image.png

三,将harbor的解析写入到Image中

因为暂时还没有找到将Dns记录写入到docker中的方法,因此只能采用比较粗鲁的方式———直接修改docker中的hosts文件的方式,如下
image.png
这样的话,就确保在docker的容器内,集群也可以访问harbor的域名进行下载,从而统一下载仓库

Kind集群配置

Kind的意思是Kubernetes in docker,结构示意图如下
image.png
Kind的官网如下
Kind官网
Kind创建的每个Node节点实际上只是一个Image而已,如下
image.png
使用Kind创建的K8s集群中的每个Pod都是Image中的1个进程而已。

一,KindConfig的配置

Config的配置如下

[root@node001 kind-init]# cat kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.node001.home:5000"]
    endpoint = ["http://harbor.node001.home:5000"]
## 该段配置表示给Kind集群内的docker配置registry-mirrors
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
## 该段配置表示开启Ingress功能
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
## 该段配置表示将Ingress的端口设置为主机的80和443端口(这里表示的是将docker 容器的80和443端口直接使用宿主机的端口)
- role: worker
- role: worker

二,Kind初始化

执行以下脚本初始化即可

[root@node001 kind-init]# cat run-kind-cluster.sh
#!/bin/bash
kind create cluster --config kind-config.yaml --image kindest/node:v1.18.8
## 后面指定image主要是因为我电脑上已有v1.18.8了,就不用重新下载了

创建后,查看Kind创建的集群如下
image.png

三,配置Ingress-controller

为集群创建Ingress-controller,执行如下命令

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

等待Ingress-controllerd的Pod状态Running之后,查看如下
image.png
说明Ingress-controller部署成功了,注意,其中的Ingress-controller的image来自于k8s.gcr.io,因此需要注意我大天朝墙的问题。

四,验证

部署1个example的用例,来测试。example的yaml如下

[root@node001 ~]# cat example.yaml
kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
  - name: foo-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=foo"
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 5678
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - name: bar-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=bar"
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: node001.home
  - http:
      paths:
      - path: /foo
        backend:
          serviceName: foo-service
          servicePort: 5678
      - path: /bar
        backend:
          serviceName: bar-service
          servicePort: 5678
---

直接apply该文件即可,等待Pod的状态为Running之后,如下
image.png
可以看到Pod,Svc,Ingress都已经创建好了。
在/etc/hosts文件中填写node001.home的解析,如下

[root@node001 ~]# grep node001.home /etc/hosts
192.168.1.101	node001.home

使用curl访问Ingress,如下
image.png
可以看到使用node001.home/带上不同的路径后缀可以访问到不同的Pod,即表示成功

Kuboard配置

Kuboard是1款K8s的Dashboard软件吧。中文界面的,比较方便
Kuboard的官网

一,安装

安装教程在官网,中文资料很齐全,就不再介绍了,就直接aply其中的2个yaml就可以了。

二,配置Ingress

因为有了Ingress,所以就将所有的服务都用域名来访问,会方便点,因此,为kuboard创建1个ingress,其yaml如下
image.png
直接apply即可(注意,ingress需要和kuboard部署在同一个namespace中,因为ingress不能跨namespace来选择svc
在/etc/hosts中创建对应的域名解析,如下
image.png

三,验证

Pod验证

查看kuboard和metrics-server的2个Pod是否Running即可
image.png

Web验证

从Web页面登录kuboard,如下
image.png
其中的登录时候的token可以使用如下脚本获取

[root@node001 kuboard]# cat get-kuboard-passwd.sh
#!/bin/bash
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

image.png登录如下
image.png
这样的话,就验证成功了,可以很清晰的看到集群内的各种情况。

ArgoCD配置

前言

关于进行CI/CD的工具也有很多,Jenkins,Gitlab,tekton等,但是最先看到Argo,就用Argo吧

一,安装

官网上安装过程已经讲解的很清楚了,如下
ArgoCD官网教程
直接apply即可

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

需要注意的是,因为我的Ingress中没有配置https,因此,需要将Argo修改成使用http的(默认Argocd是使用https的),修改如下
image.png
在上述文件中,argocd-server的启动命令中加入如上参数即可,直接apply即可

二,配置Ingress

为ArgoCD服务配置ingress访问,其yaml如下
image.png
直接apply即可(注意,需要将该ingress创建在和argocd同一个namespace下,因为ingress无法跨namespace
在/etc/hosts文件中配置好argocd.node001.home的解析即可,如下
image.png

三,验证

从Web端登录argocd.node001.home即可,如下
image.png
ArgoCD的默认账户admin,其默认密码是argocd-server的pod的名字,获取密码如下,
image.png
登录即可如下
image.png

开发链Skaffold配置

虽然前面配置了Argocd,但是事实上不是生产环境的话,基本上用不到CI/CD的流程,毕竟太大了,因此作为本地开发链的话,选择了skaffold工具,自动化build,push,deploy,简直不用太爽。
而且skaffold只有1个二进制包,直接开箱即用就是了,可以在Github上搜索也可以如官网
skafflod官网

使用

在1个目录根目录下,创建你为该应用编写的各种yaml,然后直接skafflold init即可,会自动根据该目录下的yaml文件编写出skafflold.yaml文件,然后直接skaffold dev或者skaffold run即可,skaffold.yaml如下
image.png
实际使用skafflod体验如下
image.png
注意,测试用的ingress中的域名,需要提前配置在/etc/hosts文件中,其他的均可自动化,只要在skaffold dev的状态中,你任意改动目录下的任何文件,Skaffold都会自动重新deploy改动的部分。