NingG +

Kubernetes 系列:安装 & 入门

概要

关于 Kubernetes ,几个方面:

准备工作

官网地址: Kubernetes Documentation

有什么用

Kubernetes 是一种解决方案,聚焦容器的集群管理、服务编排。

安装

完全按照官网 Install Minikube 进行操作即可。

备注: Minikube, 在本地的 VM 中,启动一个单节点的 Kubernetes 集群。Minikube 包括了所有功能,以及所有的核心组件,进行本地应用开发,基本足够了。

在 minikube 下,配置 kubelet、apiserver、proxy、controller-manager、etcd、scheduler 等,具体配置参数,可参考:Running Kubernetes Locally via Minikube

安装 kubectl 客户端

说明信息:

我使用的是 MacPro,因此,采用下述方式,进行安装:

# 1. 通过 homebrew 安装 kubectl
brew install kubernetes-cli

# 2. 查看版本
kubectl version

上述安装过程中,可能遇到下述问题,具体问题和解决办法:

# 1. 当前用户的权限不够
$ brew install kubernetes-cli
Error: /usr/local/Cellar is not writable. You should change the
ownership and permissions of /usr/local/Cellar back to your
user account:
  sudo chown -R $(whoami) /usr/local/Cellar
Error: Cannot write to /usr/local/Cellar

# 解决办法:变更权限
$ sudo chown -R $(whoami) /usr/local/Cellar


# 2. Xcode 版本过低
Error: Your Xcode (8.3.2) is too outdated.
Please update to Xcode 9.2 (or delete it).
Xcode can be updated from the App Store.

# 解决办法:在 App Store 中,搜索 Xcode 进行更新

# 3. 没有权限
Homebrew: Could not symlink, /usr/local/bin is not writable

# 解决办法:变更目录权限
sudo chown -R `whoami`:admin /usr/local/bin

# 补充:有的情况下,还需要变更 share 和 opt 的权限
sudo chown -R `whoami`:admin /usr/local/share
sudo chown -R `whoami`:admin /usr/local/opt

配置 kubectl

安装 kubectl 之后,需要进行配置,才能跟 Kubernetes 集群交互。

关于 kubectl 的配置:

补充说明:

安装 Minikube

细节参考: Install Minikube

此次我安装的是最新版本 v0.28.2,具体 Mac 下,安装步骤:

brew cask install minikube

安装过程中,出现问题的解决方案:

# 出现的问题
Error: Permission denied @ dir_s_mkdir - /usr/local/Caskroom/minikube

# 解决方案
sudo chown -R `whoami`:admin /usr/local/Caskroom

如果网络不好,但是可以通过浏览器下载,则,可以把下载之后的文件,复制到指定的目录:

具体的目录结构,例如:

~/.minikube/cache
 - iso
   - minikube-v0.28.1.iso
 - v1.10.0
   - kubeadm
   - kubelet

基本用法

几个方面:

下述异常,以及解决方案:

# 异常现象
Error with pre-create check: "VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path"

# 解决方案
# 1. 查询 virtualbox
brew search virtualbox
# 2. 安装 virtualbox
brew cask install virtualbox

关于 Kubernetes 的基本用法,参考:

具体的操作:

# 1. 启动 Minikube 集群:一个单节点的 Kubernetes 集群
$ minikube start

Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
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.

# 查看日志
$ minikube logs

# 查看集群状态
$ kubectl get pods --namespace=kube-system -o wide

# 查看 minikube 的状态
$ minikube status

# 查看 minikube 已经启动的插件
$ minikube addons list


# 2. 本地连接到 minikube 集群
$ kubectl cluster-info

# 3. 查看本地 minikube 集群的信息
$ kubectl cluster-info dump | less

# 4. 关闭 minikube 集群
$ minikube stop

# 5. 删除 minikube 集群
$ minikube delete

# 6. 启动 dashboard:
$ minikube dashboard

备注:上述操作中,minikube dashboard 命令,会直接打开 http://192.168.99.100:30000 Kubernetes 的管理后台页面.

特别说明:上述过程,有可能遇到一些问题,他们的解决方案,如下:

# 1. 问题描述: 无法连接到 minikube 内部的网络
Error starting cluster: timed out waiting to elevate kube-system RBAC privileges: creating clusterrolebinding: Post https://192.168.99.100:8443/apis/rbac.authorization.k8s.io/v1beta1/clusterrolebindings: Service Unavailable

# 解决办法:
关闭本机的 VPN 等

# 2. kubernetes-dashboard 等 pod 一直出现 CrashLoopBackOff 异常,无法正常启动 dashboard
$ kubectl get po --all-namespaces
...
NAMESPACE     NAME                                    READY     STATUS             RESTARTS   AGE
kube-system   kubernetes-dashboard-5498ccf677-fh2rj   0/1       CrashLoopBackOff   11         2h
...

# 解决办法:重新创建一次镜像
$ minikube stop
$ minikube delete
$ minikube start


# 统一执行
$ minikube stop && minikube delete && minikube start

特别说明:

中国国内,因为 GFW 的存在,可能无法拉取镜像等内容,此时,需要以代理方式启动 minikube。

具体分为 2 个步骤:

  1. 定位问题:查询 minikube 的启动日志,判断是否是 GFW 导致的
  2. 解决问题:以 HTTP 和 HTTPS 的代理模式,启动 minikube

操作细节:

# 查询启动日志
$ minikube logs 

...
Aug 21 15:31:28 minikube kubelet[2687]: E0821 15:31:28.536418    2687 kuberuntime_manager.go:646] createPodSandbox for pod "kube-controller-manager-minikube_kube-system(16a099baef9c74567ee1930ed78d0339)" failed: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause-amd64:3.1": Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
...

# 以 HTTP 和 HTTPS 代理模式,启动 minikube
$ minikube start --docker-env=HTTP_PROXY=http://127.0.0.1:8118 --docker-env=HTTPS_PROXY=https://127.0.0.1:8118

如果没有 HTTP 和 HTTPS 本地代理, 则,基于之前的 ShadowsocksX 采用的 Socket5 代理,只在浏览器生效,在 iterm 等终端,无法翻墙。

具体解决办法:

  1. 设置 HTTP 代理:iterm 等终端中,设置 HTTP 代理
  2. 使用 HTTP 代理,启动 minikube 集群:参考上面的命令

另外,如果没有 HTTP 代理,同时,也没有 ShadowsocksX 等 Socket5 代理时,则,可以手动下载镜像文件,细节参考:

本次的解决办法:

  1. iterm 终端,升级为 HTTP 代理
  2. 仍然有部分 image 找不到,手动进行下载,具体参考下面细节

查看 minikube 启动的 log 日志,发现仍有 image 找不到:

# 查看 minikube 的 log 日志
minikube logs

...
Aug 21 17:31:37 minikube kubelet[2693]: E0821 17:31:37.453747    2693 pod_workers.go:186] Error syncing pod 9a2b8fee6510861e37a3351eb1aba711 ("kube-apiserver-minikube_kube-system(9a2b8fee6510861e37a3351eb1aba711)"), skipping: failed to "CreatePodSandbox" for "kube-apiserver-minikube_kube-system(9a2b8fee6510861e37a3351eb1aba711)" with CreatePodSandboxError: "CreatePodSandbox for pod \"kube-apiserver-minikube_kube-system(9a2b8fee6510861e37a3351eb1aba711)\" failed: rpc error: code = Unknown desc = failed pulling image \"k8s.gcr.io/pause-amd64:3.1\": Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"
...

手动下载 image,并且打 tag:(阿里的镜像查询地址:https://dev.aliyun.com/search.html)

# 1. 登录 minikube 虚拟机
minikube ssh

# 2. 下载镜像
docker pull anjia0532/pause-amd64:3.1

# 3. 打一个新的 Tag
docker tag anjia0532/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1

# 4. 查看镜像
docker image ls

# 5. 其他镜像

docker pull anjia0532/pause-amd64:3.1 && docker tag anjia0532/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1

docker pull registry.cn-beijing.aliyuncs.com/k8s_images/etcd-amd64:3.1.12 && docker tag registry.cn-beijing.aliyuncs.com/k8s_images/etcd-amd64:3.1.12 k8s.gcr.io/etcd-amd64:3.1.12

docker pull registry.cn-hangzhou.aliyuncs.com/k8sth/kube-scheduler-amd64:v1.10.0 && docker tag registry.cn-hangzhou.aliyuncs.com/k8sth/kube-scheduler-amd64:v1.10.0 k8s.gcr.io/kube-scheduler-amd64:v1.10.0

docker pull registry.cn-hangzhou.aliyuncs.com/k8sth/kube-controller-manager-amd64:v1.10.0 && docker tag registry.cn-hangzhou.aliyuncs.com/k8sth/kube-controller-manager-amd64:v1.10.0 k8s.gcr.io/kube-controller-manager-amd64:v1.10.0

docker pull registry.cn-hangzhou.aliyuncs.com/k8sth/kube-apiserver-amd64:v1.10.0 && docker tag registry.cn-hangzhou.aliyuncs.com/k8sth/kube-apiserver-amd64:v1.10.0 k8s.gcr.io/kube-apiserver-amd64:v1.10.0

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-addon-manager:v8.6 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-addon-manager:v8.6 k8s.gcr.io/kube-addon-manager:v8.6

docker pull registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-kube-dns-amd64:1.14.8 && docker tag registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8

docker pull registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-sidecar-amd64:1.14.8 && docker tag registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8

docker pull registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-dnsmasq-nanny-amd64:1.14.8 && docker tag registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8

docker pull registry.cn-shanghai.aliyuncs.com/google-gcr/storage-provisioner:v1.8.1 && docker tag registry.cn-shanghai.aliyuncs.com/google-gcr/storage-provisioner:v1.8.1 gcr.io/k8s-minikube/storage-provisioner:v1.8.1

docker pull registry.cn-hangzhou.aliyuncs.com/zhangyouliang/kubernetes-dashboard-amd64:v1.8.1 && docker tag registry.cn-hangzhou.aliyuncs.com/zhangyouliang/kubernetes-dashboard-amd64:v1.8.1 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1

docker pull registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/kube-proxy-amd64:v1.10.0 && docker tag registry.cn-shenzhen.aliyuncs.com/kubernetes1_x/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0

docker image ls

在外部,查看 pod:

# 查看 pods 列表
kubectl describe pods

# 删除失败的 pods


关联细节,参考:

参考资料

特别说明,3 个非常有价值的治疗:

Top