概述:html
这篇文章是为了介绍使用kubeadm安装Kubernetes集群(能够用于生产级别)。使用了Centos 7系统。node
PS:linux
篇幅有点长,可是比较详细、比较全面git
CentOS Linux 7 默认开起来防火墙服务(firewalld),而Kubernetes的Master与工做Node之间会有大量的网络通讯,安全的作法是在防火墙上配置Kbernetes各组件(api-server、kubelet等等)须要相互通讯的端口号。在安全的内部网络环境中能够关闭防火墙服务。github
关闭防火墙的命令:docker
1 # firewall-cmd --state #查看防火墙状态 2 # systemctl stop firewalld.service #中止firewall 3 # systemctl disable firewalld.service #禁止firewall开机启动
建议禁用SELinux,让容器能够读取主机文件系统json
执行命令:centos
1 # getenforce #查看selinux状态 2 # setenforce 0 #临时关闭selinux 3 # sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久关闭(需重启系统) 4 # shutdown -r now #重启系统
软硬件api |
最低配置浏览器 |
推荐配置 |
CPU和内存 |
Master: 至少2 Core和4G内存 Node:至少4 Core和16G内存 |
Master:4 core和16G内存 Node:应根据须要运行的容器数量进行配置 |
Linux操做系统 |
基于x86_64架构的各类Linux发行版本,Kernel版本要求在3.10及以上 |
Red Hat Linux 7 CentOS 7 |
说明:
以上为建议配置,实际安装过程当中,Master必须2 core 及以上(不然安装失败,切记),Node能够采用1 core。
主机列表:
主机名 |
Centos版本 |
ip |
docker version |
flannel version |
Keepalived version |
主机配置 |
备注 |
master01 |
7.6.1810 |
192.168.0.6 |
18.09.9 |
v0.11.0 |
v1.3.5 |
2C1G |
control plane |
work01 |
7.6.1810 |
192.168.0.10 |
18.09.9 |
/ |
/ |
1C1G |
worker nodes |
work02 |
7.6.1810 |
192.168.0.12 |
18.09.9 |
/ |
/ |
1C1G |
worker nodes |
VIP |
7.6.1810 |
192.168.0.130 |
18.09.9 |
v0.11.0 |
v1.3.5 |
4C4G |
在control plane上浮动 |
client |
7.6.1810 |
192.168.0.234 |
/ |
/ |
/ |
4C4G |
client(可不须要) |
共有7台服务器,3台control plane,3台work,1台client。
k8s 版本(可根据须要进行更改):
主机名 |
kubelet version |
kubeadm version |
kubectl version |
备注 |
master01 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl选装 |
work01 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl选装 |
work02 |
v1.16.4 |
v1.16.4 |
v1.16.4 |
kubectl选装 |
client |
/ |
/ |
v1.16.4 |
client |
Master主机改成master01,执行如下命令:
1 # hostnamectl set-hostname master01 #修改主机名称为master01 2 # more /etc/hostname #查看修改结果
一样的修改node01和node02(注意主机名为node01和node02)
说明:
退出从新登录便可显示新设置的主机名master01,从新登陆以后
执行如下命令:
cat >> /etc/hosts << EOF
192.168.0.6 master01 192.168.0.10 node01 192.168.0.12 node02 EOF
Kubeadm建议关闭交换空间的使用,简单来讲,执行swapoff -a命令,而后在/etc/fstab中删除对swap的加载,并从新启动服务器便可。
临时禁用,执行如下命令:
# swapoff -a
永久禁用,须要在swapoff -a以后,执行如下命令:
# sed -i.bak '/swap/s/^/#/' /etc/fstab
执行如下命令:
# 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
# yum clean all
# yum -y makecache
注意:
安装docker以前,最好确认一下,kubernetes支持哪些版本的docker(kubernetes和docker的版本要对应,不然可能会形成从新安装)。
# 卸载docker
#1. 列出安装过的包
# yum list installed | grep docker
#2. 根据安装过的包进行卸载
# yum -y remove docker-ce-cli.x86_64 # yum -y remove docker-ce.x86_64 # yum -y remove containerd.io
# 更新docker
# yum -y update docker
如已安装过docker,则不须要进行此步骤
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
说明:
执行以上命令以前,能够看看docker版本,执行如下命令查看
# yum list docker-ce --showduplicates | sort -r
# systemctl start docker && systemctl enable docker
安装bash-completion
# yum -y install bash-completion
加载bash-completion
# source /etc/profile.d/bash_completion.sh
# mkdir -p /etc/docker # tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://usydjf4t.mirror.aliyuncs.com", "https://registry.docker-cn.com"] , "exec-opts": ["native.cgroupdriver=systemd"] } EOF # systemctl daemon-reload # systemctl restart docker
说明:
修改cgroupdriver是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
# yum -y install keepalived
保留默认配置
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf
写入新的配置
# cat <<EOF > /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id master01 } vrrp_instance VI_1 { state MASTER interface enp0s3 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.130 } } EOF
说明:
特别注意红色字体文本,master01是主机名称(若是有其余主机则使用对应的主机名称进行替换),enp0s3是网卡名称(每一个linux系统可能不一致),192.168.0.130是虚拟IP
# service keepalived start && systemctl enable keepalived
在master机器上执行
# ip a
能够看到VIP在master01(目前只有一台master,之后可能会有多个master)上
# yum list kubelet --showduplicates | sort -r
说明:
本文安装的kubelet版本是1.16.4,该版本支持的docker版本为1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。
# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
说明:
# systemctl enable kubelet && systemctl start kubelet
# echo "source <(kubectl completion bash)" >> ~/.bash_profile # source .bash_profile
Kubernetes几乎全部的安装组件和Docker镜像都放在goolge本身的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地之后改回默认的镜像tag。本文经过运行image.sh脚本方式拉取镜像。
直接执行如下命令(灰色背景部分):
# more image.sh #如下为image.sh文件的内容 #!/bin/bash url=registry.cn-hangzhou.aliyuncs.com/loong576 #阿里云镜像仓库地址,能够按需修改 version=v1.16.4 #安装的kubernetes的版本(能够按需修改) images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`) for imagename in ${images[@]} ; do docker pull $url/$imagename docker tag $url/$imagename k8s.gcr.io/$imagename docker rmi -f $url/$imagename done
注意:
若是须要下载其余的kubernetes版本,须要修改对应的版本号(红色字体部分)
# docker images
本文的k8s网络使用flannel,该网络须要设置内核参数bridge-nf-call-iptables=1,修改这个参数须要系统有br_netfilter模块。
说明:
K8s网络插件有不少,使用网络插件以前,要进行判断是否和系统适配。
查看br_netfilter模块:
# lsmod |grep br_netfilter
若是系统没有br_netfilter模块则执行下面的新增命令,若有则忽略。
永久新增br_netfilter模块:
# cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules ; do [ -x $file ] && $file done EOF # cat > /etc/sysconfig/modules/br_netfilter.modules << EOF modprobe br_netfilter EOF # chmod 755 /etc/sysconfig/modules/br_netfilter.modules
# cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # sysctl -p /etc/sysctl.d/k8s.conf
说明:
如安装网络插件以后,长时间状态没有变动,则能够试试重启机器(或者是虚拟机,这里是指Centos 7系统)。
说明:
Master的kubernetes以前,须先肯定要肯定的网络插件(由于可能会影响到初始化的参数),不一样的系统可能须要使用不一样的网络插件(Centos 不支持 Calico)。
建议先阅读网络插件资料。(Kubernetes全部网络插件说明:这里)
# kubeadm config print init-defaults > init.default.yaml
# cat init.default.yaml
建立kubeadm.conf.yaml文件,输入如下内容(灰色背景部分):
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.16.4 apiServer: certSANs: #填写全部kube-apiserver节点的hostname、IP、VIP - master01 - node01 - node02 - 192.168.0.6 - 192.168.0.10 - 192.168.0.12 - 192.168.0.130 controlPlaneEndpoint: "192.168.0.130:6443" networking: podSubnet: "10.244.0.0/16" #这里须要根据具体的网络插件来配置(这里使用的flannel网络插件配置)
说明:
注意红色字体部份内容,须要根据init.default.yaml文件和本身的须要进行更改
# kubeadm init --config=kubeadm.conf.yaml
说明:
若是初始化失败,可执行kubeadm reset后从新初始化(执行如下两条命令)
# kubeadm reset
# rm -rf $HOME/.kube/config
初始化成功,以下图:
按照提示执行下面的命令,复制配置文件到普通用户的home目录下:
# mkdir -p $HOME/.kube # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # chown $(id -u):$(id -g) $HOME/.kube/config
在其余位置(或者主机),保存以下信息(其余node节点加入集群时使用):
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 control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root:
kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: ## node加入集群时使用 kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # source .bash_profile
说明:
若是master节点的防火墙已经关闭,能够直接跳过此小节
若是node已经加入其它集群,须要退出集群,请执行在node上执行:
# kubeadm reset
查看防火墙状态:
# systemctl status firewalld 或者 firewall-cmd --state
开启6443端口
# firewall-cmd --zone=public --add-port=6443/tcp --permanent ## 出现success代表添加成功
命令含义:
--zone #做用域 --add-port=80/tcp #添加端口,格式为:端口/通信协议 --permanent #永久生效,没有此参数重启后失效
重启防火墙
# systemctl restart firewalld.service
说明:
Kubernetes集群中的Service可以使用的物理机端口号范围为30000~32767
一次所有公开全部可能使用的端口:
# firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent # systemctl restart firewalld.service
Master节点在初始化完成以后,最后一行代码,以下:
# kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562
把两行信息复制出来,在node节点执行,以下图:(join成功)
在master节点,执行如下命令查看已经加入的节点
# kubectl get nodes
说明:
因为没有安装网络插件,这里STATUS为NotReady
在master主机上执行如下命令:
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
说明:
因为网络缘由,可能会安装失败,能够在浏览器直接下载kube-flannel.yml文件(也能够在浏览器打开url地址,而后复制文件内容到文件),而后再执行apply
查看节点状态,执行如下命令:
# kubectl get nodes
说明:
STATUS从NotReady变为Ready
# 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
# yum clean all && yum -y makecache
# yum install -y kubectl-1.16.4
安装bash- completion
# yum -y install bash-completion
加载bash-completion
# source /etc/profile.d/bash_completion.sh
# mkdir -p /etc/kubernetes
# scp 192.168.0.6:/etc/kubernetes/admin.conf /etc/kubernetes/
说明:
192.168.0.6 是master主机
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # source .bash_profile
# echo "source <(kubectl completion bash)" >> ~/.bash_profile # source .bash_profile
# kubectl get nodes
# kubectl get cs
# kubectl get po -o wide -n kube-system
# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
说明:
若是链接超时,能够多试几回。也能够在这里下载
# sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml
说明:
也能够采用其余的一些镜像(切换镜像,须要更改recommended.yaml文件)
更改镜像操做:
若是须要更改镜像的版本号,须要在阿里云查询一下是否有镜像
下载镜像命令:(注意阿里云是没有带版本号的,须要本身录入版本号)
# docker pull registry.cn-hangzhou.aliyuncs.com/kubernetesui/dashboard:v2.0.0-rc5
外网访问
# sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
说明:
配置NodePort,外部经过https://NodeIp:NodePort 访问Dashboard,此时端口为30001
建立超级管理员的帐号用于登陆Dashboard
# cat >> recommended.yaml << EOF --- # ------------------- dashboard-admin ------------------- # apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: dashboard-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin EOF
# kubectl apply -f recommended.yaml
状态查看:
# kubectl get all -n kubernetes-dashboard
令牌查看:
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
令牌为(必定要注意可能存在换行的状况):
eyJhbGciOiJSUzI1NiIsImtpZCI6IllkWjQxWENEYnBXYV9rUlNqWTRldjVOYXV3M0tPTklYTVZTWUZWOXp0SHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZzRwdzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjNmNzllODUtNzMzMy00MDY1LTg1YTEtYzkxZTkzNjk3ZjA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.vsizK9ZP53to5aL5d1oyFYAiR8Kt1LaQ_Lkt86yPgHp6QloMS_pLCdD7KZi76deQ4ISTFC9Ldc62zslLtY4qgxNvSUiVWj1bWUn2BfCJ-3jPxpd7ZOgr3Gbp2xAFc3xjgm-qZaOydec9i44CbkdiVDoAjL0Au78yt7aHSW8B6plc2fAYNdywtyIOAMhe7f0gjyRaWrGQje2CVduITxZ-2NCwd3EYQNs31OA-zUPFvel_xi_KzdMBuj4z7DdvIK9wPQHyuke0TIs5dHSUEtiY84erLMg5i0ZGXCd019D5Nrsd78fVe_NbO-NThVReskA-jt1FyhAUesZie4GX-2eL3Q
说明:
若是安装Dashboard过程当中出现问题,要仔细进行排查,可能pod尚未安装完成,等待一段时间以后,再看看,若是仍是不行,则须要考虑一下中途是否有问题,是否须要从新安装。
若是忘记Token,能够经过如下命令获取:
# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'
https://192.168.0.6:30001
部署Dashboard以后,因为证书问题致使没法在浏览器浏览(暂时没有找到解决方案,尝试了网上的方式,不行,如下是尝试的过程(能够跳过))
删除已经部署的Dashboard
1. kubectl delete ns kubernetes-dashboard
https://github.com/kubernetes/dashboard/releases
2. 阅读参考资料(并执行命令,除了删除命令)
http://www.javashuo.com/article/p-uwvomipq-dx.html
查看全部Pod
# kubectl get pods --all-namespaces
查看状态异常的Pod的详细信息
# kubectl describe pod kubernetes-dashboard-8478d57dc6-p7jt7 --namespace=kubernetes-dashboard
说明:
能够看到在哪台Node上建立了容器
建议关闭防火墙
# systemctl stop firewalld.service
# systemctl disable firewalld.service
说明:
若是不关闭防火墙,可能会形成容器产生错误,如no host to route,是由于防火墙拦截了端口。
错误描述信息:
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
须要将master节点的 /etc/kubernetes/admin.conf 文件复制到node节点下。
Kubernetes的安装:
https://www.kubernetes.org.cn/6632.html
CentOS Linux 开放端口:
http://www.javashuo.com/article/p-pnauwzxw-mb.html
Kubernetes全部网络插件说明:
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network