部署 k8s Cluster(上) — Kubernetes(5)steemCreated with Sketch.

in #kubernetes6 years ago

我们将部署三个节点的 Kubernetes Cluster。

591.png

k8s-master 是 Master,k8s-node1 和 k8s-node2 是 Node。

所有节点的操作系统均为 Ubuntu 16.04,当然其他 Linux 也是可以的。

官方安装文档可以参考 https://kubernetes.io/docs/setup/independent/install-kubeadm/

注意:Kubernetes 几乎所有的安装组件和 Docker 镜像都放在 goolge 自己的网站上,这对国内的同学可能是个不小的障碍。建议是:网络障碍都必须想办法克服,不然连 Kubernetes 的门都进不了。

安装 Docker

所有节点都需要安装 Docker。

apt-get update && apt-get install docker.io

安装 kubelet、kubeadm 和 kubectl

在所有节点上安装 kubelet、kubeadm 和 kubectl。

kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器。

kubeadm 用于初始化 Cluster。

kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

用 kubeadm 创建 Cluster

完整的官方文档可以参考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

初始化 Master

在 Master 上执行如下命令:

kubeadm init --apiserver-advertise-address 192.168.56.105 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。

--pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。在后面的实践中我们会切换到其他网络方案,比如 Canal。

初始化过程如下:

592.png

① kubeadm 执行初始化前的检查。

② 生成 token 和证书。

③ 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信。

④ 安装 Master 组件,会从 goolge 的 Registry 下载组件的 Docker 镜像,这一步可能会花一些时间,主要取决于网络质量。

⑤ 安装附加组件 kube-proxy 和 kube-dns。

⑥ Kubernetes Master 初始化成功。

⑦ 提示如何配置 kubectl,后面会实践。

⑧ 提示如何安装 Pod 网络,后面会实践。

⑨ 提示如何注册其他节点到 Cluster,后面会实践。

配置 kubectl

kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。

依照 kubeadm init 输出的第 ⑦ 步提示,推荐用 Linux 普通用户执行 kubectl(root 会有一些问题)。

我们为 ubuntu 用户配置 kubectl:

su - ubuntu
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

为了使用更便捷,启用 kubectl 命令的自动补全功能。

echo "source <(kubectl completion bash)" >> ~/.bashrc

这样 ubuntu 用户就可以使用 kubectl 了。

下节我们将安装 Pod 网络并添加 k8s-node1 和 k8s-node2,完成集群部署。

Sort:  

没办法,国内网络质量有待提高

推荐国外VPS, digitalocean/vultr都可以,新加坡或者日本的节点,一个月一个节点5/10美元,我觉得不贵

我用的aliyun香港云主机,300/年,自己用docker image搭建的openvpn,供参考。

起飞喽。感觉玩不动,安装kubelet、kubeadm 和 kubectl的时候,执行“curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -”失败,一直卡在那儿。

路径能访问么

部署master的时候竟然需要关闭swap???

老师能不能换个别的部署方式,例如下载好需要的软件到本地,然后手动安装。这种yum安装的方式,费了老大劲配置好代理,结果 Connection to "https://192.168.100.221:6443" uses proxy "http://192.168.100.22:10086/". If that is not intended, adjust your proxy settings

先把科学上网搞好吧,一劳永逸。kubeadm部署本质上就是先将image从grc.io下载到本地。不解决上网的问题,后面的事情都没法弄了

提示说加 --skip-preflight-checks ,然而 后面到了
[init] This often takes around a minute; or longer if the control plane images have to be pulled.
之后就失败了
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10255/healthz' failed with error: Get http://localhost:10255/healthz: dial tcp [::1]:10255: getsockopt: connection refused.
搞了两天解决不了

初始部署肯定不能使用 --skip-preflight-checks。问题还是在下载image上。在 /etc/kubernetes/manifests/ 目录下有几个yaml文件,里面有 k8s需要的image的路径,可以先通过 docker pull 手工下载image,然后再运行 kubeadm init

这个我试过了,应该有4个
image,gcr.io/google_containers/kube-apiserver-amd64,
gcr.io/google_containers/kube-controller-manager-amd64,
gcr.io/google_containers/kube-scheduler-amd64,
gcr.io/google_containers/etcd-amd64:3.0.17

docker 全都pull了,最后还是超时失败

这我就不明白了,既然image都有了,就应该能正常init。用docker ps 能看到相应的容器吗?另外,确保手工下载的image版本与yaml中的一致

Loading...

同样的问题。折磨死了。

主要还是网络问题,可参考上面的手工下载image的方法

请问下这个问题怎么解决的啊?手动拉也失败了

还要关闭swap?这个我还真没遇到过

[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.09.0-ce. Max validated version: 17.03
[preflight] WARNING: Connection to "https://10.10.103.25:6443" uses proxy "http://127.0.0.1:38251". If that is not intended, adjust your proxy settings
[preflight] Some fatal errors occurred:
/etc/kubernetes/manifests is not empty
running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can skip pre-flight checks with --skip-preflight-checks

直接init提示这个 ,然而我swapoff一直失败

先用 kubeadm reset 清理一下环境,另外建议用 apt-get install docker.io 安装 docker,这样安装出来的是 k8s 推荐的 docker 版本

/etc/kubernetes/manifests is not empty
这个是要 rm -rf /etc/kubernetes/manifests/*

manifests 是删了.
而swap怎么都关不掉,我也很无奈.

fstab注释了,重启

Congratulations @cloudman6! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

以后kubeadmin部署是个趋势,只是目前有两个问题:
1,屏蔽掉了安装细节,导致无法理清整个安装过程
2,主要的还是官方一直没宣布其可以用于生产环境了

用于生产环境只是时间问题。我们要尽快掌握k8s技术。因为市场需求可不会等人。

apt-key在 centos下有对应命令吗?

搞好了科学上网的环境,但是我习惯用的centos, apt-transport-https, apt-key这些都没有。

原来官网讲的挺细。。。

是这样,官网有centos上不是k8s的详细步骤

我按官网上的指导,每次到 【init】这一步了,开始拉拉镜像的时候就挂了,报错说
Unfortunately, an error has occurred:timed out waiting for the condition
This error is likely caused by:
- The kubelet is not running
- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
- There is no internet connection, so the kubelet cannot pull the following control plane images:
- gcr.io/google_containers/kube-apiserver-amd64:v1.9.1
- gcr.io/google_containers/kube-controller-manager-amd64:v1.9.1
- gcr.io/google_containers/kube-scheduler-amd64:v1.9.1

还有个地方就是,yum完kubelet以后启动, 我发现kubelet服务的状态并不是active,而是Active: activating (auto-restart), 是非正常的,官网说“The kubelet is now restarting every few seconds, as it waits in a crashloop for kubeadm to tell it what to do.” 不知道是不是因为这个原因造成的。

找到一个快速下载谷歌镜像的方法,先在git hub上创建一个项目,创建一个dockerfile把谷歌镜像的地址贴过来前面加个FROM,然后到daocloud上关联git帐户选中git项目手动触发生成镜像仓库,然后在虚拟机上docker pull镜像仓库的地址就能下载了,速度贼快,还不用翻墙,init cluster的时候提前把kube apiserver等镜像先下了初始化几分钟就搞掂,亲测有效!

您好:
请问 “创建一个dockerfile把谷歌镜像的地址贴过来前面加个FROM” 这一句谷歌镜像的地址,您写的是什么呢?

建议在steemit上写一个step by step 的图文文档,我可以帮你宣传

可以在AWS上免费申请一台EC2,搭建ss,然后配置docker的http代理

Coin Marketplace

STEEM 0.28
TRX 0.12
JST 0.032
BTC 66367.17
ETH 3007.58
USDT 1.00
SBD 3.71