kubeadm安装Kubernetes,实践记录
kubeadm安装Kubernetes,实践记录
openthings 发表于3个月前
kubeadm安装Kubernetes,实践记录
  • 发表于 3个月前
  • 阅读 551
  • 收藏 5
  • 点赞 0
  • 评论 1

移动开发云端新模式探索实践 >>>   

摘要: Kubernetes是一个强大的容器治理平台。不过对于一个可以管理大规模集群的系统,安装起来也并非易事。Kubernetes本身在快速的发展,各种坑和不同版本的差异让成功运行Kubernetes难度更大。这里将一次成功的安装过程记录下来,以供参考,收藏级。

kubeadm安装Kubernetes,实践记录

这是一次成功的安装、胜利的安装,是值得收藏的一次记录。

本文主要介绍主控节点的安装,工作节点添加参见:

这里以1.9.3为例:

赠人玫瑰,手有余香。本文来源-https://my.oschina.net/u/2306127/blog/1628082

Kubernetes是一个强大的容器治理平台。不过对于一个可以管理大规模集群的系统,安装起来也并非易事。而且由于原始的Kubernetes相关Docker镜像和安装文件都托管在gcloud上,链接指向也都是无法访问的,因此手工操作是不可避免的。再加之Kubernetes本身也在快速的发展,各种坑和不同版本的差异让成功运行Kubernetes难度更大。

最简单的方式是使用minikube(参见:https://my.oschina.net/u/2306127/blog/1621468)或者Docker for Mac/Windows(参见:https://my.oschina.net/u/2306127/blog/1606599),但这只能在开发环境下使用(用于桌面级服务也很有用),不支持多机集群和多节点的规模伸缩。

kubeadm是一个kubernetes的安装工具,可以用于快速部署kubernets集群,但上面的问题依然存在,我们可以将镜像从dockerhub上先拉下来,再改成需要的名称。在这之前,目前版本还需要有一些小的手工设置(目前版本Kubernetes基础服务已经全部容器化了,以后版本安装过程可能都全部自动化了),如下:

1、预先设置

由于目前版本兼容性限制,在Ubuntu上需要调整几个设置:

1.1 关闭swap

  • 临时关闭,运行:swapoff -a。下次启动还有。
  • 到/etc/fstab中永久删除或关闭swap分区,使用 # 注释掉即可。

1.2 关闭和清理ufw

下面的命令将清除现有的所有防火墙规则:

iptables -F

1.3 设置cgroups

确保kubelet使用的cgroup driver 与 Docker的一致。要么使用下面的方法更新 Docker:

cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

要么,设置kubernetes的cgroup driver,如:kubelet 的 --cgroup-driver 标志设置为与 Docker 一样(e.g. cgroupfs)。

1.4 安装docker 17.03

目前的Kubernetes 1.9.3验证的docker版本最高为CE 17.03,使用下面的方法安装:

apt-get update
apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
   "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable"
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
  • apt-cache madison docker-ce可以查看可用的版本。

!apt-get代理的单独设置。

  • Apt-get有时候无法访问,设了系统代理也不行。可以尝试单独设置apt的代理,如下:
$ nano /etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.199.99:9999";
Acquire::https::Proxy "https://192.168.199.99:9999";
sudo -E https_proxy=192.168.199.99:9999 apt install docker-ce=17.03.2~ce-0~ubuntu-xenial
  • 不要更新,否则docker会被更新到最新的版本。可以尝试最新版本,是可以运行的。

!参照如下格式设置docker的独立代理,清除所有系统代理(因为Kubernetes要访问本地服务)。

  • 编辑docker服务的配置文件,然后重新启动/etc/systemd/system/docker.service。
  • 详细说明 https://my.oschina.net/u/2306127/blog/1627620 。
  • 运行 sudo gedit /lib/systemd/system/docker.service,加入设置如下:
Environment="HTTP_PROXY=http://192.168.199.99:9999/" 
Environment="HTTPS_PROXY=http://192.168.199.99:9999/" 
Environment="NO_PROXY=localhost,127.0.0.0/8"

但是,在安装时还是遇到奇慢无比的情况,只能多尝试一下。

2、拉取镜像

Kubernetes的原始docker镜像在gcloud上,即使使用代理也需要注册、登录,使用gcloud工具才能获取,使用docker会导致莫名其妙的失败(出错信息含糊)。可以从DockerHub上面拉取Kubernetes镜像的复制品,然后修改docker的名称(以后可以通过kubeadm的配置文件来安装,应该就可以指定安装源了)。

2.1 创建自动拉取脚本

脚本如下,如果需要其它的容器镜像可以照此增加即可,可以将版本号修改为自己需要的。

  • 注意:kubernetes每个版本依赖的版本不同,下面适用1.9.3。
echo "=================================================="
echo "Set proxy to http://192.168.199.99:9999..."
echo ""
export http_proxy=http://192.168.199.99:9999
export https_proxy=http://192.168.199.99:9999
echo "=================================================="

echo ""
echo "Pulling Docker Images from mirrorgooglecontainers..."

echo "==>kube-apiserver:"
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3
docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.9.3 gcr.io/google_containers/kube-apiserver-amd64:v1.9.3

echo "==>kube-controller-manager:"
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.9.3
docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.9.3 gcr.io/google_containers/kube-controller-manager-amd64:v1.9.3

echo "==>kube-scheduler:"
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.9.3 
docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.9.3 gcr.io/google_containers/kube-scheduler-amd64:v1.9.3

echo "==>kube-proxy:"
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.9.3
docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.9.3 gcr.io/google_containers/kube-proxy-amd64:v1.9.3

echo "==>k8s-dns-sidecar:"
docker pull mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.8
docker tag mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.8 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8

echo "==>k8s-dns-kube-dns:"
docker pull mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.8
docker tag mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.8 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8

echo "==>k8s-dns-dnsmasq-nanny:"
docker pull mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker tag mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.8 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8

echo "==>etcd:"
docker pull mirrorgooglecontainers/etcd-amd64:3.1.11
docker tag mirrorgooglecontainers/etcd-amd64:3.1.11 gcr.io/google_containers/etcd-amd64:3.1.11

echo "==>pause:"
docker pull mirrorgooglecontainers/pause-amd64:3.0
docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

echo finished.
echo "More update, please visit: https://hub.docker.com/r/mirrorgooglecontainers"
echo ""

2.2 运行镜像获取脚本

建议将上面内容保存到getkubeimage.sh,然后运行即可。如下:

gedit getkubeimages.sh
#复制、黏贴上面的脚本内容。
sudo chmod +x getkubeimages.sh
sudo ./getkubeimages.sh

3、Kubeadm安装

3.1 首先安装kubeadm

kubeadm是用于kubernetes安装、维护的命令行工具。

echo "添加Kubernetes安装源认证key:"
sudo curl -sSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add

echo "添加Kubernetes安装源:"
sudo echo “deb http://apt.kubernetes.io/ kubernetes-xenial main” > /etc/apt/sources.list.d/kubernetes.list

echo "更新系统软件包列表:"
sudo apt update

echo "查看Kubernetes的可用版本:"
apt-cache madison kubeadm

echo "安装kubeadm 1.9.3: "
apt-get install -y kubeadm=1.9.3-00

!!!修正kubelet启动参数的错误。

对于kubeadm 1.9.3版本。将下面的内容添加到 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件。

[Service]
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

以及将 KUBELET_CGROUP_ARGS 加到启动参数中(该参数在本版本安装文件中丢失)。

最后 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 文件如下:

[Service]

Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_CGROUP_ARGS $KUBELET_EXTRA_ARGS

!然后重启kubelet服务,运行:

systemctl daemon-reload
systemctl restart kubelet

注意:在每一个节点参照上面修改kubelet的服务配置文件,否则kubelet启动失败。

  • 可以使用 sudo systemctl status kubelet查看kubelet服务的状态。

3.2 运行kubeadm init 来启动集群创建

kubeadm init --kubernetes-version=v1.9.3 --pod-network-cidr=192.168.0.0/16

或者:

kubeadm init --kubernetes-version=v1.9.3 –pod-network-cidr 10.244.0.0/16

使用Kubeadm安装的具体命令参考 https://my.oschina.net/u/2306127/blog/1627651

  • 添加节点
    • 记住上面返回值的添加节点命令,到其他节点上执行即可。
    • 如果忘记了,重新获取上面的命令,运行:
       kubeadm token create --print-join-command --ttl 0
    • 可以使用kubeadm token -h 查看token操作。
  • 重新生成CA授权码:
#openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

3.3 安装flannel网络驱动

按照上面完成后的提示执行: 

sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

!!!安装flannel网络出现pending挂起问题(podCidr参数丢失,即便在kubeadm运行时已指定):

#查看日志:
kubectl get pods --namespace kube-system
kubectl --namespace kube-system logs kube-flannel-ds-bvxd2
#上面的kube-flannel-ds-bvxd2为flannel的pod名称,根据get pods返回的名称输入。

#编辑 /etc/kubernetes/manifests/kube-controller-manager.yaml
在command节,加入:
- --allocate-node-cidrs=true
- --cluster-cidr=10.244.0.0/16

然后system restart kubelet即可。

3.4 主控节点开启

默认设置主控节点不开启任务节点功能,可以通过命令打开,从而将主控和任务节点部署到一台机器上。

kubectl taint nodes --all node-role.kubernetes.io/master-

3.5 加入集群节点

使用kubeadm join命令将其它任务节点加入主控集群。

kubeadm join –token 8dc9d8.df09161bed020a12 192.168.199.106:6443 –discovery-token-ca-cert-hash sha256:16exxx

3.6 安装失败的恢复

如果安装失败,使用 kubeadm reset 重置安装环境。大部分时候需要重启操作系统再行运行kubeadm init,因为一些系统网络服务端口已经被占用了,而且无法简单地清除。

  • 注意:如果改变了代理设置,需要将控制台窗口关闭,然后再重新打开。否则,Ubuntu系统的“设置”->“网络”->“代理”设置对话框改变的是全局环境变量http_proxy和https_proxy没有清除,仍然是有效的,导致本地服务连接不上。这也是一些服务如apt/node.js/github(代理设置参考 https://my.oschina.net/u/2306127/blog/869727)没有使用这些环境变量,导致虽然进行了操作系统设置但是仍然无效的原因所在。

4、Kubernetes安装成功信息

Kubernetes安装成功,输出信息如下所示:

root@kube:/home/supermap# kubeadm init --kubernetes-version v1.9.3 --pod-network-cidr=10.244.0.0/16[init] Using Kubernetes version: v1.9.3
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
	[WARNING FileExisting-crictl]: crictl not found in system path
[preflight] Starting the kubelet service
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [kube kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.199.111]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 33.501916 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node kube as master by adding a label and a taint
[markmaster] Master kube tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: 8b2ed3.149a349e4b775985
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join --token 8b2ed3.149a349e4b775985 192.168.199.111:6443 --discovery-token-ca-cert-hash sha256:ab69621f2117f2b283df725859724efc71c37a20f6da519237ca1dad5a72d9b2

后续操作,执行:

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

然后运行 kubectl get ns 获取命名空间(namespaces)的信息,输出如下:

supermap@kube:~$ kubectl get ns
NAME          STATUS    AGE
default       Active    22m
kube-public   Active    22m
kube-system   Active    22m

把本机作为任务节点加入:

kubectl taint nodes --all node-role.kubernetes.io/master-

查看节点情况:

supermap@kube:~$ kubectl get node
NAME      STATUS     ROLES     AGE       VERSION
kube      NotReady   master    28m       v1.9.3

现在,本机同时运行了主控和一个任务节点。
查看节点详细情况:

#显示pods列表。
kubectl get pods --namespace=kube-system -o wide

#得到pod的详细信息,其中kube-dns-6f4fd4bdf-895jh为节点名称。
kubectl get -o json --namespace=kube-system pods/kube-dns-6f4fd4bdf-895jh 

5、安装dashboard和helm

后续安装dns、dashboard、helm时还需要下面几个镜像,架上代理拉下来,或者到hub.docker.com上找到pull下来,在docker tag成相应的名字,否则kubectl get pods会显示一直处于pending状态。

docker pull quay.io/coreos/flannel:v0.10.0-amd64
docker pull gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7
docker pull k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
docker pull gcr.io/kubernetes-helm/tiller:v2.8.1

参考:

映射dashboard的端口,让外面可以访问:

kubectl port-forward kubernetes-dashboard-7798c48646-wkgk4 8443:8443 --namespace=kube-system &

现在,可以打开浏览器,输入 http://localhost:8443查看kubernetes的运行情况。

大功告成。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 232
博文 842
码字总数 435554
作品 1
评论 (1)
openthings
kubeadm 续坑篇:
https://mritd.me/2016/11/21/kubeadm-other-problems/
×
openthings
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: