Kubernetes1.12从零开始(二):用minikube部署开发测试环境

作者: 李佶澳   转载请保留:原文地址   发布时间:2018/09/03 20:43:00

说明

本系列所有文章可以在系列教程汇总中找到,演示和讲解视频位于网易云课堂·IT技术快速入门学院 课程说明资料QQ交流群Kubernetes1.12从零开始(初):课程介绍与官方文档汇总,探索过程遇到的问题记录在:Kubernetes1.12从零开始(一):遇到的问题与解决方法

这一节在Kubernetes1.12从零开始(二):部署环境准备中设置的虚拟机上部署Kubernetes,minikube用来部署一个本地运行的开发测试环境,

本系列所有文章可以在系列教程汇总中找到,Kubernetes1.12从零开始(一):遇到的问题与解决方法记录了探索过程遇到的问题。

最快捷的本地部署方式

Running Kubernetes Locally via Minikube中详细介绍了Minikube的使用方法。Minikube用来在本地启动一个单节点的Kubernetes。虽然用Minikube启动的Kubernetes集群极其简单,但是功能完善,创建简洁方便,特别适合用来做本地的开发调试环境。

这里在《Kubernetes1.12从零开始(二):部署环境准备》中准备的node1上部署minikube。

Minikube可以直接安装在宿主机上,它会自动调用指定的--vm-driver调用virtualbox等虚拟化软件,创建作为Node节点的虚拟机。

如果将--vm-driver指定为none,直接在minikube所在的机器上创建kubernetes,需要提前安装docker。

鉴于Minikube本来就是用于搭建本地部署环境的,我们这里就不踩--vm-dirver为none时的坑了,直接用minikube自己创建虚拟机。

我这里的宿主机系统是MacOS,虚拟化软件是virtualbox。如果你用的是Linux或者Windows,除了安装命令和下载的文件格式不同,其它过程基本都是相同的。

先要安装设置kubectl

参考Install and Set Up kubectl

现在各种操作系统以及它们不同的发行版对Kubernetes的支持越来越多,Kubernetes的一些组件,已经可以用这些系统支持的包管理工具安装。

例如kubectl命令,在Redhat/CentOS/Fedora上,可以通过yum源安装, 在Ubuntu/Debain/HypriotOS上,可以通过apt-get安装, Ubuntu上还可以用snap工具安装, 在Mac上可以用macports工具安装或者brew, 在Windows上可以用Powershell Gallery安装或者 用Chocolate工具安装, 还可以直接安装下载Google Cloud SDK,然后用gcloud工具安装

上面的各种安装工具能够为以后的维护提供方便,可以根据自己的需要选用。

这里使用最直接的方式安装,用curl下载kubectl二进制文件

mkdir -p  k8s-1.12/bin
cd k8s-1.12/bin
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/darwin/amd64/kubectl
chmod +x ./kubectl

注意,如果是linux系统,下载地址是:

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kubectl

如果是windows系统,下载地址是:

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/windows/amd64/kubectl.exe

下载完成之后,将所在目录添加到环境变量中,我用的Oh-My-Zsh,更改的是~/.zshrc:

echo "export PATH=`pwd`:\$PATH" >>~/.zshrc
source ~/.zshrc
cd ../../

如果用的是bash,更改~/.bashrc:

echo "export PATH=`pwd`:\$PATH" >>~/.bashrc
source ~/.bashrc
cd ../../

windows上也可以更改环境变量,参考java在windows上的安装设置方法。

设置kubectl命令自动补全

这一步不是必须的。

kubectl是操作管理Kubernetes集群的命令,它包含的子命令以及参数比较多,为了操作便利,可以设置命令自动补全

我用的是Oh-My-Zsh,只需要在~/.zshrc的plugins中加一行kubectl:

plugins=(
  git
  kubectl
)

更改后,要重新source ~/.zshrc

如果使用的是Bash,需要安装bash-completion:

yum install bash-completion -y   
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

在Mac上的安装bash-completion方法是:

## If running Bash 3.2 included with macOS
brew install bash-completion
## or, if running Bash 4.1+
brew install bash-completion@2

如果在Mac上用的是bash,并且用brew安装的kubectl,会自行设置命令补全,如果不是用brew安装的kubectl,还需要需要手动设置一下:

kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl

安装minikube

Minikube是一个单独项目,可以直接到它的release页面中下载最新版本:

也可以用brew、choco等工具安装,在minikube项目的Readme中有介绍。

这里采用直接下载二进制文件的方式,下载的也是Mac版本:

cd k8s-1.12/bin/
curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v0.29.0/minikube-darwin-amd64
chmod +x minikube 
cd ../../

Linux的下载地址是:

 curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v0.29.0/minikube-linux-amd64

使用minikube启动kubernetes集群

minikube是支持多种虚拟化软件的:

virtualbox
vmwarefusion
kvm2 (driver installation)
kvm (driver installation)
hyperkit (driver installation)
xhyve (driver installation) (deprecated)

前面章节提过,可以在运行的时候用--vm-driver=指定,如果不需要就使用none,--vm-driver=none,这时候就在宿主机中部署kubernetes,需要自己准备好Docker。

我们这里使用的virtualbox,--vm-driver的默认值就是virtualbox,所以不需要指定,直接启动:

minikube start --kubernetes-version v1.12.0

特别注意,我用的是当前(2018-10-05 23:04:41)最新的版本的minikube(0.29.0),默认下载的kubernetes版本还是v1.10.0。 强行执行指定使用v1.12.0之后,启动报错,或许是和v1.12.0版本的kubernetes没有磨合好。

因此,退回使用minikube默认的1.10.0版本了:

minikube stop
minikube delete
minikube start

启动过程中,minikube下载minikube的虚拟机镜像会比较慢,镜像的地址如下,可能需要翻_qiang才能下载:

https://storage.googleapis.com/minikube/iso/minikube-v0.29.0.iso

镜像总共171.87M,我挂载VPN从香港下载速度还可以。

整个启动过程如下:

$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Downloading Minikube ISO
 171.87 MB / 171.87 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading kubelet v1.10.0
Downloading kubeadm v1.10.0
Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

然后就可以直接用kubectl操作整个单节点的kubernetes了:

$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}

$ kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1m

另外要注意,minikube部署的kubernetes中部分组件例如coredns等也是部署在kubernetes中,它们使用的镜像都位于gcr.io中,这个地址需要翻_qiang才能访问。

用下面的命令看到所有的Pod都是Running状态时,Kubernetes才进入正常状态:

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE
kube-system   coredns-c4cffd6dc-497p6                 1/1     Running   0          2m
kube-system   etcd-minikube                           1/1     Running   0          4m
kube-system   kube-addon-manager-minikube             1/1     Running   0          4m
kube-system   kube-apiserver-minikube                 1/1     Running   1          4m
kube-system   kube-controller-manager-minikube        1/1     Running   0          4m
kube-system   kube-dns-86f4d74b45-8lzfb               3/3     Running   0          5m
kube-system   kube-proxy-9229q                        1/1     Running   0          5m
kube-system   kube-scheduler-minikube                 1/1     Running   0          5m
kube-system   kubernetes-dashboard-6f4cfc5d87-mrl2l   1/1     Running   0          2m
kube-system   storage-provisioner                     1/1     Running   0          2m

如果不使用虚拟化软件,直接在宿主机部署,可以考虑用下面的脚本,这是minikube项目的Readme中给出的:

export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
mkdir -p $HOME/.kube
mkdir -p $HOME/.minikube
touch $HOME/.kube/config

export KUBECONFIG=$HOME/.kube/config
sudo -E minikube start --vm-driver=none

# this for loop waits until kubectl can access the api server that Minikube has created
for i in {1..150}; do # timeout for 5 minutes
   kubectl get po &> /dev/null
   if [ $? -ne 1 ]; then
      break
  fi
  sleep 2
done

# kubectl commands are now able to interact with Minikube cluster

minikube管理创建的Kubernetes

启动,以及启动特定版本的kubernetes,上一节已经提到了:

minikube start --kubernetes-version v1.12.0

停止:

minikube stop

删除:

minikube stop

minikube的其它命令

首先在用minikube启动kubernetes集群的时候,子命令start有很多参数可以用:

minikube start --help

Running Kubernetes Locally via Minikube给出了几个例子,分别是指定cni,runtime等:

$ minikube start \
    --network-plugin=cni \
    --container-runtime=containerd \
    --bootstrapper=kubeadm

$ minikube start \
    --network-plugin=cni \
    --extra-config=kubelet.container-runtime=remote \
    --extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \
    --extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \
    --bootstrapper=kubeadm

还可以在启动的时候通过--extra-config参数,配置kubernetes的下列组件:

kubelet
apiserver
proxy
controller-manager
etcd
scheduler

使用方法如下,格式为“组件名.参数名=设置的value”:

--extra-config=kubelet.MaxPods=5
--extra-config=scheduler.LeaderElection.LeaderElect=true
--extra-config=apiserver.Authorization.Mode=RBAC

操作kubernetes

操作kubernetes当然使用kubectl,无论使用哪种方式部署的kubernetes,都使用kubectl命令直接管理。

kubectl的详细使用,我们放在以后的章节中,这里只说一下minikube自己的一些小命令。

首先,minikube创建kubernetes的时候,会创建一个名为minikube的上下文(context)。这个所谓的context,其实就是Apiserver地址和用户证书的组合, 指示kubectl用相应用户的证书访问相应的地址。

这个上下文放在哪里呢?~/.kube/config中:

$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/lijiao/.minikube/ca.crt
    server: https://192.168.99.100:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/lijiao/.minikube/client.crt
    client-key: /Users/lijiao/.minikube/client.key

这个是需要了解的,知道我们正在用哪些证书访问哪个地址,如果你自己增加了上下文,可以在执行kubectl命令的时候指定:

kubectl get pods --context=minikube

然后,minikube有一个强大的子命令叫做addons,它可以在kubernetes中安装插件(addon)。这里所说的插件,就是部署在Kubernetes中的Deploymen或者Daemonset。

Kubernetes在设计上有一个特别有意思的地方,就是它的很多扩展功能,甚至于基础功能也可以部署在Kubernetes中,比如网络插件、DNS插件等。安装这些插件的时候, 就是用kubectl命令,直接在kubernetes中部署。

minikube集成了常用的插件,但默认没有全部开启,用下面的命令可以看到所有插件的状态:

$ minikube addons list
- addon-manager: enabled
- coredns: enabled
- dashboard: enabled
- default-storageclass: enabled
- efk: disabled
- freshpod: disabled
- heapster: disabled
- ingress: disabled
- kube-dns: disabled
- metrics-server: disabled
- nvidia-driver-installer: disabled
- nvidia-gpu-device-plugin: disabled
- registry: disabled
- registry-creds: disabled
- storage-provisioner: enabled

你可以根据自己的需要启用或者关停:

 minikube addons disable XXX
 minikube addons enable  XXX

minikube默认部署了dashborad插件,用下面的命令自动打开dashboard,注意Dashboard的Pod必须已经启动:

minikube dashboard

获取通过nodeport暴露的服务,用下面的命令获取地址:

# minikube service [-n NAMESPACE] [--url] NAME
# 例如: 
$ minikube service -n kube-system --url kubernetes-dashboard
http://192.168.99.100:30000

用minikube部署kubernetes的介绍就到这里,主要内容基本都覆盖了,kubernetes的操作我们不展开,因为那是另一个内容相当多的部分。 接下来,你可以继续了解下用kubeadm部署多节点集群的方法,以及手动部署的Kubernetes集群的方法,也可以跳过安装,直接了解后面的“Kubernetes的操作使用”。

参考

  1. Running Kubernetes Locally via Minikube
  2. Bootstrapping Clusters with kubeadm
  3. Creating a Custom Cluster from Scratch
  4. Kubernetes1.12从零开始(二):部署环境准备
  5. Install Minikube
  6. Install and Set Up kubectl
  7. kubernetes minikube project
  8. Creating a single master cluster with kubeadm
  9. Installing kubeadm
  10. moby、docker-ce与docker-ee
  11. Creating Highly Available Clusters with kubeadm

限时活动,每邀请一人即返回25元!

Copyright @2011-2018 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: lijiaocn@foxmail.com,备注网站合作 友情链接: lijiaocn github.com