基于Wsl Ubuntu20.04上安装Kuberneters

前言

win10可谓windows系统对开发人员最友好的版本了,linux命令行加win的桌面系统,强强联合,正因为这个Linux子系统,让本地测试环境搭建与开发起飞. 下面就针对在wsl2下面的ubuntu20.04上面安装k8s开发环境做点说明. 创建本地k8s开发环境,主要是通过kind来实现

kind 安装

kind(Kubernetes IN Docker) 是一个基于 docker 构建 Kubernetes 集群的工具,非常适合用来在本地搭建基于 Kubernetes 的开发/测试环境。所以在安装kind前,最好把wsl,docker,国内镜像这些前置工作准备好. 通过 https://github.com/kubernetes-sigs/kind/releases/latest 获取最新的 release,根据自己的系统类型选择相应的系统 release,下载 release 之后重命名为 kind(Windows 系统 release 重命名为 kind.exe),然后将其放在某一个目录下,并要确保这个目录在系统 PATH 中以方便的使用,可以放在 usr/bin 目录下(默认已经在系统 PATH 中),linux 系统中可能需要配置文件权限

$ sudo chmod +x kind

or 需要本地有golang环境,并且GOPATH/bin在PATH中,如果不在,需要 export PATH="$(go env GOPATH)/bin:${PATH}"

$ GO111MODULE=on go get sigs.k8s.io/kind@v0.10.0

拉取镜像 kindest/node

最新的 v0.20.2/v0.19.7 我测试时有bug,后来测试到v.19.1是正常的,所以这里我就采用了v1.19.1

$ docker pull kindest/node:v1.19.1

操作 Kuberneters 集群

使用 kind 创建 Kubernetes 集群非常的方便,只需要一行命令即可

$ kind create cluster #这里默认是使用kind的默认最新版本,我测试新版本有问题,故我测试的时候指定了下面的版本

or 特定版本

$ kind create cluster --image kindest/node:v1.19.1

成功的返回

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.19.1) 🖼 
 ✓ Preparing nodes 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

删除集群

$ kind delete cluster

默认集群名称是 “kind”,如果要创建多个或者指定集群名称,可以指定 name 参数:

$ kind create cluster --name=k8s-cluster1

删除集群

kind delete cluster --name=k8s-cluster1

kubectl 安装

$ sudo apt update 
$ sudo apt upgrade
$ sudo apt install -y apt-transport-https
$ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
$ echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt update
$ sudo apt install -y kubelet kubeadm kubectl

创建集群成功之后,就可以使用 kubectl 来操作 k8s 集群了

查看集群信息

$ kubectl get all --all-namespaces
NAMESPACE            NAME                                             READY   STATUS    RESTARTS   AGE
kube-system          pod/coredns-f9fd979d6-sg289                      1/1     Running   0          6m43s
kube-system          pod/coredns-f9fd979d6-wjksf                      1/1     Running   0          6m43s
kube-system          pod/etcd-kind-control-plane                      1/1     Running   0          6m50s
kube-system          pod/kindnet-9jv9s                                1/1     Running   0          6m44s
kube-system          pod/kube-apiserver-kind-control-plane            1/1     Running   0          6m50s
kube-system          pod/kube-controller-manager-kind-control-plane   1/1     Running   0          6m50s
kube-system          pod/kube-proxy-5fmtx                             1/1     Running   0          6m44s
kube-system          pod/kube-scheduler-kind-control-plane            1/1     Running   0          6m50s
local-path-storage   pod/local-path-provisioner-78776bfc44-fqm22      1/1     Running   0          6m43s

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  7m3s
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   7m2s

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kindnet      1         1         1       1            1           <none>                   7m1s
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           kubernetes.io/os=linux   7m2s

NAMESPACE            NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
kube-system          deployment.apps/coredns                  2/2     2            2           7m2s
local-path-storage   deployment.apps/local-path-provisioner   1/1     1            1           7m1s

NAMESPACE            NAME                                                DESIRED   CURRENT   READY   AGE
kube-system          replicaset.apps/coredns-f9fd979d6                   2         2         2       6m44s
local-path-storage   replicaset.apps/local-path-provisioner-78776bfc44   1         1         1       6m44s

查看容器内部容器列表

获取这个容器内部的运行容器列表,这个容器内部通过 crictl 来操作容器,可以参考 https://github.com/kubernetes-sigs/cri-tools

$ docker exec kind-control-plane crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID
03496f54d192d       bfe3a36ebd252       8 minutes ago       Running             coredns                   0                   e170783fe655f
f2874e6f6eba7       bfe3a36ebd252       8 minutes ago       Running             coredns                   0                   f2d4a12df3a93
178d427a80a68       e422121c9c5f9       8 minutes ago       Running             local-path-provisioner    0                   1600c76f4bc03
d019fbe2d252a       b77790820d015       8 minutes ago       Running             kindnet-cni               0                   f94e9d590d2ea
d8bc5b5bf64ea       47e289e332426       8 minutes ago       Running             kube-proxy                0                   84ff49f7a0532
a2e91623770af       0369cf4303ffd       8 minutes ago       Running             etcd                      0                   d680864effc4a
753ad7868585a       7dafbafe72c90       8 minutes ago       Running             kube-controller-manager   0                   c0325d328da3d
a246720f380f2       4d648fc900179       8 minutes ago       Running             kube-scheduler            0                   af718164f1b76
7a499ab5ae3f2       8cba89a89aaa8       8 minutes ago       Running             kube-apiserver            0                   735ec1dcd8891

kind 创建集群成功之后,就可以向 kubernetes 集群部署资源了,开始你的 Kubernetes 之旅吧~

Kind:创建仪表板

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

执行上面命令如果碰到了如下情况,就到github上面看源代码,自己本地建一个来使用.

The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

新建一个用户kind放脚本的目录

$ mkdir ~/kind && cd ~/kind && touch recommended.yaml
# 把内容复制到recommended.yaml中,然后执行下面的命令

$ kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

创建dashboard-adminuser.yaml

$ cat > dashboard-adminuser.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard  
EOF

创建登录用户

$ kubectl apply -f dashboard-adminuser.yaml

说明:上面创建了一个叫admin-user的服务账号,并放在kubernetes-dashboard 命名空间下,并将cluster-admin角色绑定到admin-user账户,这样admin-user账户就有了管理员的权限。默认情况下,kubeadm创建集群时已经创建了cluster-admin角色,我们直接绑定即可。

查看admin-user账户的token

$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

创建本地代理

$ kubectl proxy

现在即可使用浏览器打开

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

输入刚刚获取到的token,点登录,即可进入.

安装helm

$ curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -   
$ sudo apt install apt-transport-https --yes
$ echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
$ sudo apt update
$ sudo apt install helm
$ helm version
version.BuildInfo{Version:"v3.5.2", GitCommit:"167aac70832d3a384f65f9745335e9fb40169dc2", GitTreeState:"dirty", GoVersion:"go1.15.7"}

安装ingress-nginx

这里会用到k8s.gcr.io的docker镜像,请用中科大镜像加速

$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update

$ helm install ingress-nginx ingress-nginx/ingress-nginx

结语

至此,k8s的本地开发环境就创建好了,后续就是往里加东西了。