基于Windows 10的 WSL2 配置和搭建Kubernetes的高效开发环境
作者:互联网
## 基于Windows 10的 WSL2 配置和搭建Kubernetes的高效开发环境
### 一、准备环境
> 1.1 硬件环境
这是我的工作开发机器配置:
CPU: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz(建议i5 以上)
RAM: 64.0 GB(建议16GB及以上)
磁盘: 250GB 固态磁盘(建议)
> 1.2 Windows 10版本要求 和 启用WSL
我的版本号: 19043.1081
在运行中输入 winver 即可查看到 Windows 10 版本号。
(1)按下 Windows + R
(2)在运行中执行 winver 命令
控制面板-> 所有控制面板项 -> 程序和功能 -> 启用或关闭Windows 功能 -> 适用于Linux的Windows子系统
> 1.3 一套远程Kubernetes 环境
这里我是用了一台闲置NUC8部署了CentOS7 上面部署一套单点Kubernetes集群 ),和我的工作开发机在一个交换机上,如果没有资源条件,也可以开一台虚拟机部署单点Kubernetes集群,然后去掉master节点不允许调度的污点
```bash
#允许master节点调度
$ kubectl taint nodes master-noede node-role.kubernetes.io/master-
#恢复不允许 master节点调度
$ kubectl taint node master-noede node-role.kubernetes.io/master="":NoSchedule
```
> 1.4 wsl_update_x64.msi
双击安装补丁更新
> 1.5 Ubuntu_2004.2020.424.0_x64.appx
开启一个CMD或者Powershell窗口,运行如下命令
```Powershell
Add-AppxPackage .\Ubuntu_2004.2020.424.0_x64.appx
```
> 1.6 Docker Desktop Installer.exe
选装,建议安装,如果本地要构建镜像,需要用到Docker
安装完成之后,需要配置基于WSL2启用Dockers
Settings -> Resources -> WSL INTEGRATION -> Enable Ubuntu-20.04 -> Apply & Restart
> 1.7 Visual Studio Code
双击安装
> 1.8 在WSL2 Ubuntu 20.04 上部署和配置Golang
```bash
#环境变量配置
GOROOT=/home/lvzhiqiang/go
GOPATH=/home/lvzhiqiang/gopath
PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export PATH GOROOT GOPATH
```
> 1.9 在WSL2 Ubuntu 20.04 上安装Telepresence
https://www.telepresence.io/docs/v1/reference/install/
```bash
curl -s https://packagecloud.io/install/repositories/datawireio/telepresence/script.deb.sh | sudo bash
sudo apt install --no-install-recommends telepresence
```
> 1.10 在WSL2 Ubuntu 20.04 上安装kubectl和配置kubeconfig
+ 将远程集群的kubectl 工具放到本地/usr/bin/目录下
+ 将远程集群kubernetes 的kubeconfig 放到本地.kube/config文件中
### 二、实战配置
#### 本地运行一个获取 default deployment的程序
> 2.1 远程集群运行一个临时deployment
```bash
$ kubectl create deployment get-deployments --image=busybox:1.28
```
> 2.2 启动本地节点接入kubernetes集群环境,即本地节点充当远程集群的一个POD环境,能够像在集群本地一样访问集群的所有资源,例: svc等
#注意: svc 跨命名空间访问需要限定命名空间,比如: kubernetes.default, test-svc.testns
```bash
#启动代理接入,会进到一个新Shell下,后续命令将在这个新Shell操作,如果需要特定的shell,可以指定一个 --run /bin/zsh,如果应用需要给集群中其它POD访问,需指定暴露端口: --expose , 比如: 集群svc 的端口是 80,ep的端口是8080,那么svc指向我这个本地端口是这样的, svc(80) -> pod(8080) -> local(8080), 参数需要设定成这样: --expose 8080:8080
$ telepresence --swap-deployment get-deployments --namespace default
#模拟POD环境
$ mkdir /var/run/secrets/kubernetes.io/
$ chmod 777 /var/run/secrets/kubernetes.io/
$ ln -s $TELEPRESENCE_ROOT/var/run/secrets/kubernetes.io/serviceaccount /var/run/secrets/kubernetes.io/
```
注意: 从telepresence shell环境退出之后,需要清理相关文件,否则下次重新进行会链接到旧的失效文件
```bash
#telepresence shell
@kube-dev|lvzhiqiang:lvzhiqiang $ exit
exit
T: Your process has exited.
T: Exit cleanup in progress
T: Cleaning up Pod
╭─lvzhiqiang@Going ~
╰─$ sudo rm -f /var/run/secrets/kubernetes.io/serviceaccount
```
> 2.3 VSCode配置
```JSON
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "running get-deployments",
"type": "go",
"request": "launch",
"mode": "auto",
"env": {
"KUBERNETES_SERVICE_HOST": "kubernetes.default",
"KUBERNETES_SERVICE_PORT": "443"
},
"buildFlags": "-mod=vendor",
"program": "${fileDirname}"
}
]
}
```
> 2.4 代码
```golang
package main
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func main() {
//基于ServiceAccount获取集群配置
config, err := rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
//创建一个clientset客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
deployments, err := clientset.AppsV1().Deployments("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
for idx, deploy := range deployments.Items {
fmt.Printf("%d -> %s\n", idx+1, deploy.Name)
}
}
```
> 2.5 配置ServiceAccount绑定角色,给get-deployments下的default serviceaccount绑定一个读去default命名空间的资源对象的角色
如果不配置,运行程序就会报如下错误信息:
```bash
deployments.apps is forbidden: User "system:serviceaccount:default:default" cannot list resource "deployments" in API group "apps" in the namespace "default"
```
配置ServiceAccount绑定, default-ns-role.yaml 内容如下:
```YAML
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: default-ns-role
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: default-ns-role-binding
namespace: default
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: Role
name: default-ns-role
apiGroup: rbac.authorization.k8s.io
```
```bash
$ kubectl apply -f default-ns-role.yaml
```
> 2.6 运行程序效果如下
```bash
1 -> busybox-client
2 -> get-deployments
```
至此我们就完成了如何搭建一个基于Kubernetes的高效开发环境,不用每次写完代码还要打包发布到集群调试,直接在本地模拟一个真实的Kubernetes运行环境,大大节省了我们的调试时间。
附件:
2.代码示例和工具链接地址
链接:https://pan.baidu.com/s/1SqJPRqnAyOFOGBQDcZ3Xlg
提取码:7vb2
标签:10,Kubernetes,kubernetes,Windows,deployments,default,集群,io,bash 来源: https://blog.51cto.com/u_4073279/3006944