Kubernetes 号称云原生操作系统,可想而知其复杂程度也是非常大的,由许多组件组成,我们很难去追踪到所有的组件信息 。
文章插图
上图中至少列出了七八个组件,我们这里会忽略其中大部分组件,要运行一个最小级别的 Kubernetes 至少要包括如下三个基本组件:
- kubelet:在集群中每个节点上运行的代理,负责容器真正运行的核心组件
- kube-apiserver:Kubernetes 控制平面的组件,提供资源操作的唯一入口
- 容器运行时(Docker)
安装首先需要在节点上安装 Docker 容器运行时,我们这里使用的是操作系统为 centos7 版本,在 root 用户下面执行相关操作 。执行如下所示命令直接安装即可:
$ yum install -y yum-utils$ yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo$ yum install -y docker-ce docker-ce-cli containerd.io$ systemctl enable docker$ systemctl daemon-reload$ systemctl start docker
接下来,我们需要获取 Kubernetes 二进制文件 。实际上,我们只需要使用 kubelet 组件来引导我们的“集群”,因为我们可以使用 kubelet 来运行其他组件,一旦集群启动了,我们就可以使用 kubectl 来进行操作了 。$ curl -L https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz > server.tar.gz$ tar xzvf server.tar.gz$ cp kubernetes/server/bin/kubelet .$ cp kubernetes/server/bin/kubectl .$ ./kubelet --versionKubernetes v1.18.5
由于 kubelet 配置太多,但是这里我们只需要几个设置参数即可:$ ./kubelet -h<far too much output to copy here>$ ./kubelet -h | wc -l284
我们这里需要使用的是 --pod-manifest-path 这个参数,该参数用于指定要运行的静态 Pod 文件的目录,静态 Pod 不受 Kubernetes API 管理,虽然平时我们在使用 Kubernetes 的时候比较少使用静态 Pod,但是对于引导集群却是非常有用,对 Kubeadm 熟悉的应该知道,该方案就是利用静态 Pod 将 Kubernetes 控制面板容器化的 。下面我们来尝试下是否可以使用 kubelet 来运行 Pod 。首先我们创建一个静态 Pod 目录来运行 kubelet:
$ mkdir pods$ ./kubelet --pod-manifest-path=pods
然后重新打开一个终端,创建如下所示的 Pod 资源清单文件:$ cat <<EOF > pods/hello.yamlapiVersion: v1kind: Podmetadata:name: hellospec:containers:- image: busyboxname: hellocommand: ["echo", "hello world!"]EOF
上面资源清单出现在 pods 目录后,就可以在 kubelet 日志中看到如下所示的错误信息:......E0707 10:25:58.48983921311 pod_workers.go:191] Error syncing pod ab61ef0307c6e0dee2ab05dc1ff94812 ("hello-iz2ze8x2keg0a301rpa7cvz_default(ab61ef0307c6e0dee2ab05dc1ff94812)"), skipping: failed to "CreatePodSandbox" for "hello-iz2ze8x2keg0a301rpa7cvz_default(ab61ef0307c6e0dee2ab05dc1ff94812)" with CreatePodSandboxError: "CreatePodSandbox for pod "hello-iz2ze8x2keg0a301rpa7cvz_default(ab61ef0307c6e0dee2ab05dc1ff94812)" failed: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.2": Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"......
这是因为 Kubernetes 的 Pod 默认情况下会优先启动一个 k8s.gcr.io/pause:3.2的 pause 镜像,而该镜像由于某些原因获取不到,我们可以 --pod-infra-container-image 参数重新指定一个可以访问到的镜像:$ ./kubelet --pod-manifest-path=pods --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2
现在我们检查下 Docker 容器是否有新的容器启动:$ docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESd6e822dbcebdbusybox"echo 'hello world!'"27 seconds agoExited (0) 26 seconds agok8s_hello_hello-iz2ze8x2keg0a301rpa7cvz_default_ab61ef0307c6e0dee2ab05dc1ff94812_3102b999be2ddregistry.aliyuncs.com/google_containers/pause:3.2"/pause"2 minutes agoUp 2 minutesk8s_POD_hello-iz2ze8x2keg0a301rpa7cvz_default_ab61ef0307c6e0dee2ab05dc1ff94812_0$ docker logs k8s_hello_hello-iz2ze8x2keg0a301rpa7cvz_default_ab61ef0307c6e0dee2ab05dc1ff94812_3hello world!
kubelet 通过我们指定的静态 Pod 目录,读取其中的 YAML 文件来创建 Pod 。由于我们这里执行的就是 echo 命令,所以会不断的重启,验证完成后删除该 YAML 文件即可 。当然这还不够,我们还需要运行 APIServer,要做到这一点,我们需要首先运行 etcd,同样的我们也可以使用静态 Pod 来运行 etcd,创建如下所示的 etcd 资源清单文件:
推荐阅读
- 聊聊小程序运行机制的那些事
- 欧洲云服务器和VPS有哪些区别?
- Snakeviz是一个python的交互式可视化的图形化文件分析库
- 怎么优雅的选择 MySQL 存储引擎
- 借呗花呗真的要关闭吗 借呗什么原因会关闭
- 淘宝店铺定位可以采用哪三种方式 淘宝的产品定位是什么
- 使用docker 打包自己的镜像方式
- 天猫推广是做什么的 天猫平台推广方式有哪些
- 淘宝开票信息修改 淘宝默认的开票信息在哪里修改
- 彻底禁止Windows 10更新,你的电脑你做主