kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境

Tags: 视频教程  kubernetes 

目录

说明

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

这一节在 部署环境准备 中设置的虚拟机上部署 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,会在当前机器上创建 kubernetes,当前机器上需要安装有 docker。

鉴于 Minikube 本来就是用于搭建本地部署环境的,这里就不踩 --vm-dirver 为 none 时的坑了,直接用 minikube 自己创建虚拟机。这里的宿主机系统是MacOS,虚拟化软件是 virtualbox。如果你用的是 Linux 或者 Windows,除了安装命令和下载的文件格式不同,其它过程基本都是相同的。

安装设置kubectl

参考 Install and Set Up kubectl,现在各种操作系统以及它们不同的发行版对 Kubernetes 的支持越来越多,Kubernetes 的一些组件,已经可以用这些系统支持的包管理工具安装。 例如 kubectl命令:

上面的各种安装工具能够为以后的维护提供方便,可以根据自己的需要选用,这里使用最直接的方式:用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 支持多种虚拟化软件,用 --vm-driver= 指定,如果不需要虚拟化使用 --vm-driver=none。关闭虚拟化后,在当前机器上直接部署 kubernetes,b本机需要安装有 docker。

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

--vm-driver 默认是 virtualbox,下面的命令在 virtualbox 管理的虚拟机中创建 v1.12.0 版本的 kubernetes:

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才能下载,镜像总共171.87M:

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

最终启动过程如下:

$ 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操作:

$ 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 delete

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

kubectl的详细使用方法在以后的章节中,这里只说一下和minikube有关的部分。

minikube创建kubernetes的时候,会创建一个名为minikube的上下文(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插件等。 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 service list

用minikube部署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

kubernetes

  1. kubernetes 使用:多可用区、Pod 部署拓扑与 Topology Aware Routing
  2. kubernetes 扩展:Cloud Controller Manager
  3. kubernetes 准入:操作合法性检查(Admission Control)
  4. kubernetes 鉴权:用户操作权限鉴定(Authorization)
  5. kubernetes 认证:用户管理与身份认证(Authenticating)
  6. kubernetes 开发:代码生成工具
  7. kubernetes 扩展:operator 开发
  8. kubernetes 扩展:CRD 的使用方法
  9. kubernetes configmap 热加载,inotifywatch 监测文件触发热更新
  10. kubernetes 扩展:扩展点和方法(api/cr/plugin...)
  11. kubernetes 调度组件 kube-scheduler 1.16.3 源代码阅读指引
  12. kubernetes 代码中的 k8s.io 是怎么回事?
  13. 阅读笔记《不一样的 双11 技术,阿里巴巴经济体云原生实践》
  14. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  15. ingress-nginx 的限速功能在 nginx.conf 中的对应配置
  16. kubernetes 中的容器设置透明代理,自动在 HTTP 请求头中注入 Pod 信息
  17. kubernetes ingress-nginx 的测试代码(单元测试+e2e测试)
  18. kubernetes ingress-nginx http 请求复制功能与 nginx mirror 的行为差异
  19. kubernetes 基于 openresty 的 ingress-nginx 的状态和配置查询
  20. kubernetes ingress-nginx 0.25 源代码走读笔记
  21. kubernetes ingress-nginx 的金丝雀(canary)/灰度发布功能的使用方法
  22. kubernetes 操作命令 kubectl 在 shell 中的自动补全配置
  23. kubernetes 组件 kube-proxy 的 IPVS 功能的使用
  24. kubernetes initializer 功能的使用方法: 在 Pod 等 Resource 落地前进行修改
  25. kubernetes 版本特性: 新特性支持版本和组件兼容版本
  26. kubernetes API 与 Operator: 不为人知的开发者战争(完整篇)
  27. kubernetes 1.12 从零开始(七): kubernetes开发资源
  28. kubernetes 1.12 从零开始(六): 从代码编译到自动部署
  29. kubernetes 网络方案 Flannel 的学习笔记
  30. kubernetes 1.12 从零开始(五): 自己动手部署 kubernetes
  31. kubernetes 1.12 从零开始(四): 必须先讲一下基本概念
  32. kubernetes 1.12 从零开始(三): 用 kubeadm 部署多节点集群
  33. kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境
  34. kubernetes 1.12 从零开始(一): 部署环境准备
  35. kubernetes 1.12 从零开始(零): 遇到的问题与解决方法
  36. kubernetes 1.12 从零开始(初): 课程介绍与官方文档汇总
  37. kubernetes 集群状态监控:通过 grafana 和 prometheus
  38. 一些比较有意思的Kubernetes周边产品
  39. Borg论文阅读笔记
  40. kubelet下载pod镜像时,docker口令文件的查找顺序
  41. kubernetes 的 Client Libraries 的使用
  42. kubernetes的网络隔离networkpolicy
  43. kube-router的源码走读
  44. kubernetes 跨网段通信: 通过 calico 的 ipip 模式
  45. kubernetes的调试方法
  46. kubernetes 与 calico 的衔接过程
  47. 怎样理解 kubernetes 以及微服务?
  48. kubernetes中部署有状态的复杂分布式系统
  49. kubernetes的apiserver的启动过程
  50. kubernetes的api定义与装载
  51. kubernetes的federation部署,跨区Service
  52. kubernetes的编译、打包、发布
  53. kubernetes的第三方包的使用
  54. kubernetes的Storage的实现
  55. kubernetes 的 Apiserver 的 storage 使用
  56. kubernetes的Controller-manager的工作过程
  57. kubernetes的Client端Cache
  58. kubernetes 的 Apiserver 的工作过程
  59. kubernetes的CNI插件初始化与Pod网络设置
  60. kubernetes的Pod变更过程
  61. kubernetes的kubelet的工作过程
  62. kuberntes 的 Cmdline 实现
  63. kubernetes的Pod内挂载的Service Account的使用方法
  64. kubernetes的社区资源与项目参与方式
  65. kubernetes的Kube-proxy的转发规则分析
  66. kubernetes的基本操作
  67. kubernetes在CentOS上的集群部署
  68. kubernetes在CentOS上的All In One部署
  69. 怎样选择集群管理系统?

视频教程

  1. kubernetes 1.12 从零开始(七): kubernetes开发资源
  2. kubernetes 1.12 从零开始(六): 从代码编译到自动部署
  3. kubernetes 1.12 从零开始(五): 自己动手部署 kubernetes
  4. kubernetes 1.12 从零开始(四): 必须先讲一下基本概念
  5. kubernetes 1.12 从零开始(三): 用 kubeadm 部署多节点集群
  6. kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境
  7. kubernetes 1.12 从零开始(一): 部署环境准备
  8. kubernetes 1.12 从零开始(零): 遇到的问题与解决方法
  9. kubernetes 1.12 从零开始(初): 课程介绍与官方文档汇总
  10. 【视频】新型监控告警工具prometheus(普罗米修斯)入门使用(附视频讲解)
  11. 【视频】超级账本HyperLedger: Fabric Go SDK的使用
  12. 【视频】超级账本HyperLedger: Fabric使用kafka进行区块排序(共识)
  13. 【视频】超级账本HyperLedger: 为Fabric的Peer节点配置CouchDB
  14. 【视频】超级账本HyperLedger: Fabric从1.1.0升级到1.2.0
  15. 【视频】超级账本HyperLedger: 使用Ansible进行Fabric多节点分布式部署(实战)
  16. 【视频】超级账本HyperLedger: Fabric进阶,在已有的Channel中添加新的组织
  17. 【视频】超级账本HyperLedger: Fabric-CA的使用演示(两个组织一个Orderer三个Peer)
  18. 【视频】超级账本HyperLedger: Fabric的全手动、多服务器部署教程
  19. 【视频】超级账本HyperLedger: Fabric nodejs SDK的使用
  20. 超级账本HyperLedger: Fabric部署过程时遇到的问题汇总
  21. 【视频】8元小课之自动化运维工具ansible(二): 文档阅读摘要
  22. 【视频】8元小课之自动化运维工具ansible(一): 使用入门

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球