根据kubernetes官网给的setup说明书 https://kubernetes.io/docs/setup/independent/install-kubeadm/,我们可以有多种方案来安装kubernetes:
完全是个人喜好问题,没有原因。。。
这里选用的 Ubuntu 18.04.2 LTS
CPU 4核
内存 8G
磁盘 40G
豪华配置,只为快。。。
可以根据 https://docs.docker.com/install/linux/docker-ce/ubuntu/ 提供的几种安装方法选一种进行安装。
但是由于我们安装docker是作为kubernetes的运行时环境,一定要保证docker版本在Ubuntu里面能和kubernetes兼容。
所以这里我们选用的Ubuntu提供的docker安装源进行安装:
切换到root用户
apt-get update
apt-get install -y docker.io
安装完成之后通过 docker --version 来验证是否成功安装以及docker的版本号
docker --version
Docker version 18.09.2, build 6247962
根据https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/,kubeadm提供给了我们快速构建kubernetes集群的能力。
首先我们需要对其进行安装
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
从安装命令里面我们可以看到,这里不仅装了kubeadm,还装了kubectl和kubelet。
kubectl提供给我们访问kubernetes API的命令式工具
kubelet则是用于在每一个宿主机上根据具体的命令调用运行时容器(这里为docker)的命令来构建Pod和container。
用kubeadm部署master节点只需要一条命令就可以完成
kubeadm init [flags]
其中flags表示我们可以额外进行的配置,可配置选项可以参考https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
如果部署的时候提示不支持swap的错误,可以通过以下命令将swap分区禁掉
swapoff -a
在init期间kubeadm做了很多事情:
对当前系统进行一系列的检查看是否符合kubernetes运行需求,有些不严重的检查会以warning的形式告知我们,而有些严重的检查会以error的形式告知我们并同时结束init过程,直到我们解决问题或者通过配置 --ignore-preflight-errors= 忽略问题
为即将安装的组件生成一系列的证书,默认放在 /etc/kubernetes/pki 目录下
在 /etc/kubernetes/ 目录下生成一些配置文件提供给后续安装的kubelet,controller-manager等用于访问API server
启动master节点相关的pod:
pod名称 | 作用 |
---|---|
kube-apiserver | k8s api 服务端,用于处理rest请求 |
kube-controller-manager | k8s核心控制循环,通过api server获取状态并对集群状态进行改变 |
kube-scheduler | k8s 调度器,通过一定的策略综合性能资源的限制进行资源调度 |
etcd | k8s使用的数据库 |
等上面几个pods启动完成后,Master节点会被打上“污点”标签,用来保证不会有其他业务相关的pod被调度到master节点,以保证master节点能正常运行
生成节点加入时需要用到的token和配置
添加默认的插件,这里包括CoreDNS和kube-proxy
至此Master节点部署顺利完成!
在init操作命令打印结果的最后我们可以看到一些提示
由于Kubernetes 集群默认需要加密方式访问,所以我们需要通过以下命令才能用kubectl对kubernetes集群进行访问
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
我们需添加一个pod网络插件用于容器间的相互通信,如果没有网络插件,所有和其相关的pod都会调度失败。这里我们选用weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
如果我们需要添加工作节点,则需要通过上面提供的join命令来完成
kubeadm join 172.16.38.137:6443 --token 95ex69.lq0r14fzgzq629e1 \
--discovery-token-ca-cert-hash sha256:982fccda0ee2929cb774bd975cbc01274c268c11682b08ed581d5412cca291c0
worker节点的部署比较简单。
和Master节点一样先执行安装docker和kubeadm相同的步骤。
然后调用上面的join命令即可
上面在kubeadm init的过程中我们提到过master节点会被打上“污点”标签,从而导致master节点不会被纳入业务pod的调度范围。所以正常情况下我们需要两个宿主机才能构建一个正常运行的kubernetes cluster。
但是在一般的试验测试环境下,我们没有必要搭建这么庞大的环境。
所以我们可以通过手动将master节点的“污点”标签给去掉来允许master节点的可调度性。
kubectl taint nodes --all node-role.kubernetes.io/master-
这条命令最后的“-”号表示删除所有以 “node-role.kubernetes.io/master” 为键的“污点”标签。
至此,单节点的kubernetes cluster就部署完毕了。