手把手带你玩转k8s-win10上搭建k8s集群

11,108 阅读6分钟

前言

前面的系列教程都是在阿里云上实践的,最近自己组装了一台台式电脑,装上了win10系统。为了让更多的小伙伴有机会学习k8s的编排,这里使用了另一个更为简单的方案——Docker for Windows。当然,使用mac的同学也可以使用Docker for Mac。其安装使用方式都大同小异。这里重点讲一下在win10上的安装。

准备工作

系统配置

image-20200802192227735

开始虚拟化

先查看CPU是否支持虚拟化和是否已启用虚拟化。

image-20200802192011497

image-20200802191819382

如果未启用,需要进入到BIOS进行设置,这里略。

启用Hyper-V

安装Docker for Windows需要使用虚拟化,可以使用Hyper-V,也可以使用Oracle Virtual Box,如果安装的系统不符合运行Docker for Windows的要求,则可以安装Docker Toolbox。这里不做介绍。

设置->应用->程序和功能->启用和关闭Windows功能image-20200802192500716

image-20200802194641122

image-20200802194820851

启用Hyper-V

image-20200802194915968

后续k8s教程需要,NFS客户端也启用了吧。Telnet客户端也是常用工具,也顺道启用了。

image-20200802195039581

启用好后,重启电脑。

下载地址

Docker for Windows

img

官网

image-20200802193904737

安装Docker

img

双击上面下载的Docker for Windows Installer.exe

image-20200808201918679

image-20200808201952436

image-20200808202100659

安装成功,桌面会出现图标

image-20200802195611901

右下脚可查看

image-20200808202428384

image-20200808202413149

可以修改镜像加速,这里使用阿里云的。

image-20200808202712957

这里只要Docker running为绿色即可,Kubernetes先别管。冒然安装,会安装失败。

验证安装的docker

  • 打开终端查看版本:
docker version

image-20200808203059617

  • 下载nginx镜像
docker pull nginx

image-20200802200335386

  • 运行nginx镜像
docker run -p 81:80 -d --name mynginx nginx

为了方便使用linux的命令,这里使用了git bash

image-20200802201727058

  • 浏览器访问http://localhost:81

image-20200802200928676

  • 清理刚运行的nginx实例
# 停止刚运行的名称为mynginx的实例
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker stop
# 删除刚运行的名称为mynginx的实例
docker ps -a | grep mynginx | awk '{print $1}' | xargs docker rm

image-20200802201759127

安装Kubernetes

准备安装镜像

如果不提前准备好镜像的话,在启用Kubernetes的时候,页面会卡死,原因就是镜像默认会从Kubernetes提供的官方地址下载,该地址在国内是被墙的,所以我们需要将相关镜像先下载到本地。

github.com/AliyunConta…

![

](qiniu.mldong.com/mldong-arti…)

  • 克隆脚本
git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git
  • 进入目录
cd k8s-for-docker-desktop
  • 检出对应版本分支
git checkbot v1.16.5
  • 以管理员身份运行PowerShell

image-20200802203245791

  • 重新进入k8s-for-docker-desktop目录
  • 设置执行脚本权限
Set-ExecutionPolicy RemoteSigned
  • 执行下载镜像脚本

脚本的逻辑其实就是

  1. 从阿里云镜像仓库下载镜像
  2. 修改镜像tag为官方地址
  3. 删除阿里镜像
./load_images.ps1
  • 关闭执行脚本权限
Set-ExecutionPolicy Restricted

image-20200802203748999

image-20200802203800085

启用Kubernetes集群

安装好镜像后,就可以启用Kubernetes集群了。该过程会有一丢丢久,正常启动后,Kubernetes则会显绿色。

image-20200808203137963

image-20200808210124778

image-20200808210510300

下载Kubectl客户端

下载地址:www.kubernetes.org.cn/installkube…

image-20200802204540731

配置环境变量,略。

验证Kubernetes集群

  • 切换当前集群
kubectl config use-context docker-desktop
  • 验证Kubernetes集群状态
kubectl cluster-info
kubectl get nodes

image-20200802204955552

安装ingress-nginx

看过前面系列文章的同学可能知道,Kubernetes总共三种暴露服务的方式。

  • LoadBlancer Service
  • NodePort Service
  • Ingress

这里不做过多的介绍了,有想了解的同学可以去查资料。我们使用云平台的时候,云平台已经帮安装好ingress-nginx了,我们只需要定义yaml文件使用即可,这里我们需要自己安装。

ingress-nginx负载均衡调用顺序:用户--->ingress-nginx(pod)--->ingress-nginx(控制器)--->ingress--->service--->pod

不同版本的Kubernetes,使用的ingress-nginx版本是不一样的,我们可以看一下我们现在对应的版本是啥。

可以看看k8s-for-docker-desktop/images.properties文件

image-20200802211535280

github地址:github.com/kubernetes/…

image-20200802211644109

是啥版本,就去看对应的文件。

  • 依次下载yaml文件

image-20200802212240083

image-20200802214633217

image-20200802214705065

  • 开始安装
kubectl apply -f mandatory.yaml
kubectl apply -f cloud-generic.yaml
  • 查看
kubectl get pods -n ingress-nginx

image-20200802214929902

  • 浏览器访问http://localhost

image-20200802214945340

完整地发布一个nginx服务

创建命名空间

  • nginx-ns.yaml
cat << EOF > nginx-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mldong-study
  
EOF

  • 执行发布命令
kubectl apply -f nginx-ns.yaml
  • 查看执行结果
kubectl get ns

image-20200802215728932

创建ConfigMap-配置文件

  • nginx-cm.yaml
cat << EOF > nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cm
  namespace: mldong-study
data:
  a.conf: |-
    server {
      listen       80;
      server_name  a.study.com;
      location / {
        root   /usr/share/nginx/html;
        index  a.html;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
  b.conf: |-
    server {
      listen       80;
      server_name  b.study.com;
      location / {
        root   /usr/share/nginx/html;
        index  b.html;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
    
  
EOF

  • 执行发布命令
kubectl apply -f nginx-cm.yaml
  • 查看执行结果
kubectl get cm -n mldong-study

image-20200802222243494

创建ConfigMap-html文件

win上使用hostpath不是很方便,后续会使用nfs。这里先以最简单的方式演示。

  • nginx-cm-html.yaml
cat << EOF > nginx-cm-html.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-cm-html
  namespace: mldong-study
data:
  a.html: |-
    aaaaaa
  b.html: |-
    bbbbbb
  
EOF

  • 执行发布命令
kubectl apply -f nginx-cm-html.yaml
  • 查看执行结果
kubectl get cm -n mldong-study

创建Deployment

  • nginx-deployment.yaml
cat << EOF > nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: mldong-study
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      annotations:
        version/config: V0001
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: port
              protocol: TCP
          volumeMounts:
            - name: nginx-cm-html
              mountPath: "/usr/share/nginx/html"
            - name: nginx-cm
              mountPath: "/etc/nginx/conf.d"ls
      volumes:
        - name: nginx-cm-html
          configMap: 
            name: nginx-cm-html
        - name: nginx-cm
          configMap:
            name: nginx-cm
  
EOF
  • 执行发布命令
kubectl apply -f nginx-deployment.yaml
  • 查看执行结果
kubectl get pods -n mldong-study

image-20200802222418364

创建Service

  • nginx-service.yaml
cat << EOF > nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
  namespace: mldong-study
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    #nodePort: 32180 # 这里不指定就会随机(30000-32767)
  selector:
    app: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: mldong-study
spec:
  type: ClusterIP
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

EOF

  • 执行发布命令
kubectl apply -f nginx-service.yaml
  • 查看执行结果
kubectl get service -n mldong-study

image-20200802222632065

创建Ingress

  • nginx-ingress.yaml
cat << EOF > nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
  name: mynginx-ingress
  namespace: mldong-study
spec:
  rules:
    - host: a.study.com
      http:
        paths:
          - backend:
              serviceName: nginx
              servicePort: 80
            path: /
    - host: b.study.com
      http:
        paths:
          - backend:
              serviceName: nginx
              servicePort: 80
            path: /

  
EOF

  • 执行发布命令
kubectl apply -f nginx-ingress.yaml
  • 查看执行结果
kubectl get ingress -n mldong-study

image-20200802223328697

修改hosts

image-20200802223533643

浏览器访问

a.study.com

b.study.com

image-20200802230514957

image-20200802230525836

最后清理现场

kubectl delete -f nginx-ns.yaml

如需要再次执行,依次执行如下命令:

kubectl apply -f nginx-ns.yaml
kubectl apply -f nginx-cm.yaml
kubectl apply -f nginx-cm-html.yaml
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml

image-20200802231134661

小结

本文在Win10系统上安装Docker for Windows,并启用了其Kubernetes集群-单节点版,完整的发布了一个nginx的服务。可以这么说,安装好Docker for Windows并成功启用其Kubernetes后,你就可以正式入门学习k8s编排了。当然,在该环境下,不只是可以学习k8s编排,像docker/docker-compose也是自带的,也可以安排上。

项目源码地址

  • 后端

gitee.com/mldong/mldo…

  • 前端

gitee.com/mldong/mldo…

相关文章

手把手带你玩转k8s-集群创建和Hello World

手把手带你玩转k8s-ConfigMap与持久化存储

手把手带你玩转k8s-完整的发布一个可对外访问的服务

手把手带你玩转k8s-docker进阶Dockerfile与docker-compose

手把手带你玩转k8s-一键部署springboot项目

手把手带你玩转k8s-一键部署vue项目

手把手带你玩转k8s-常用对象详解

手把手带你玩转k8s-jenkins安装与流水线

手把手带你玩转k8s-jenkins流水线语法

手把手带你玩转k8s-jenkins流水线发布springboot项目

手把手带你玩转k8s-jenkins流水线发布vue项目

手把手带你玩转k8s-健康检查之存活探针与就绪探针