Background

网上相关经验已有很多,这里对自己的安装过程做个记录,方便以后查阅。

  • kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
  • kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

1、安装环境

  • 三台虚拟机【主节点:4核4G,节点都是2核2G】
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • Centos 7.5.1804
  • docker: 18.06.1
  • kubelet:V1.13.3

2、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

3、关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

4、关闭swap

swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

5、配置主机名与IP对应关系

cat << EOF >> /etc/hosts 
192.168.0.70 k8s-master
192.168.0.71 k8s-node1
192.168.0.72 k8s-node2
EOF

6、将桥接的IPv4流量传递到iptables

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

7、配置免密登录(可选)

# 所有节点执行,四次回车
ssh-keygen -t rsa
# 所有节点执行,有几个节点执行几次
ssh-copy-id [每个节点的IP]

8、安装docker

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker version
  • 更换国内镜像源
cat <<EOF> /etc/docker/daemon.json
{
	"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
EOF
  • 重载配置文件重启docker生效
systemctl daemon-reload 
systemctl restart docker

9、添加阿里云源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

10、安装kubeadm,kubelet,kubectl(所有节点)

yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0
systemctl enable kubelet

11、部署k8s master(主节点)

该条命令执行完,会打印出使用kubectl工具需要执行的命令,以及其它节点加入集群需要执行的命令。

kubeadm init \
  --apiserver-advertise-address=192.168.0.70 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.13.3 \
  --service-cidr=10.1.0.0/16\
  --pod-network-cidr=10.244.0.0/16

12、使用kubectl工具

上条命令执行完会有提示。

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 nodes

13、安装pod网络插件(CNI)(所有节点)

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sed -i 's/quay.io\/coreos/registry.cn-beijing.aliyuncs.com\/imcto/g' kube-flannel.yml
kubectl apply -f kube-flannel.yml

14、节点加入集群(在node节点执行)

执行你的在kubeadm init输出的kubeadm join命令,下面的是我的。上面11步执行后生成的。

kubeadm join 192.168.0.71:6443 --token l79g5t.6ov4jkddwqki1dxe --discovery-token-
ca-cert-hash sha256:4f07f9068c543130461c9db368d62b4aabc22105451057f887defa35f47fa076
kubeadm join 192.168.0.72:6443 --token l79g5t.6ov4jkddwqki1dxe --discovery-token-
ca-cert-hash sha256:4f07f9068c543130461c9db368d62b4aabc22105451057f887defa35f47fa076
  • 验证集群各节点是否正常,如下图所示为正常,如果出现notReady,请看最后的参考资料解决。
kubectl get nodes

在这里插入图片描述

15、部署dashboard

  • 下载配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
  • 默认镜像国内无法访问,修改镜像地址为 reg.qiniu.com/k8s/kubernetes-dashboard-amd64:v1.8.3,如下图所示
    在这里插入图片描述

  • 默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露端口到外部,如下图所示
    在这里插入图片描述

  • 开始部署

kubectl apply -f kubernetes-dashboard.yaml
  • 测试部署是否成功
kubectl get pods,svc -n kube-system
  • 重新部署命令(若需要时)
kubectl delete -f kubernetes-dashboard.yaml
kubectl apply -f kubernetes-dashboard.yaml

16、创建service account并绑定默认cluster-admin管理员集群角色

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  • 输出token登录信息
kubectl describe secrets -n kube-system dashboard-admin

在这里插入图片描述

17、使用输出的token登录Dashboard

  • 首先查看Dashboard服务被分配到了哪个节点

需要注意:可不是在哪个节点部署最后服务就会在哪个节点,就像我的,我在主节点部署,最后服务是被分配到了node2节点。另外,status列都是Running服务才是正常,如果出现ImagePullBackOff或者CrashLoopBackOff等,请看最后参考资料解决。

kubectl get pods --all-namespaces -o wide

在这里插入图片描述

  • 然后浏览器访问 https:192.168.0.72:30001
    在这里插入图片描述
  • 谷歌浏览器可能会遇到不是私密链接的问题,如下图所示,在当前页面敲键盘输入 thisisunsafe 即可跳转到登录页面。
    在这里插入图片描述
    在这里插入图片描述

18、删除节点1(在master节点执行)

kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8s-node1
kubectl get nodes

在这里插入图片描述

19、添加节点1

  • 在node1执行
kubeadm reset

在这里插入图片描述

  • 在主节点执行,根据生成的节点加入命令在node1节点执行加入就行了。
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.0.70:6443 --token 1a1xzk.1yizznmyqho4a4p0 --discovery-token-ca-cert-hash sha256:0b729fe83194bd397b2cc4801ef899d4c40395a61f0fabc0c651bddc423d438a
  • 在node1执行
[root@k8s-node1 ~]# kubeadm join 192.168.0.70:6443 --token p08kmc.nci5h0xfmlcw92vg --discovery-token-ca-cert-hash sha256:44315d59e08f4d94bc75d20730b861818dfeda6517c1b228399f061f4256329b
[preflight] Running pre-flight checks
[discovery] Trying to connect to API Server "192.168.0.70:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.0.70:6443"
[discovery] Requesting info from "https://192.168.0.70:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.0.70:6443"
[discovery] Successfully established connection with API Server "192.168.0.70:6443"
[join] Reading configuration from the cluster...
[join] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-node1" as an annotation

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.
  • 在主节点执行
kubectl get nodes

在这里插入图片描述

参考资料

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐