目录
一、Centos7 配置说明
1.1 Firewalld(防火墙)
1.2 SELinux
二、安装准备工作
2.1 安装环境
2.2 部署环境说明
2.3. 配置主机名(master和node节点都执行)
2.3.1 修改主机名
2.3.2 修改hosts文件
2.3.3 禁用swap
2.3.4 设置kubernetes源
三、Docker安装(master和node节点都执行)
3.1 卸载/更新已经安装的Docker
3.2 安装Docker环境
3.2.1 配置docker源
3.2.2 安装依赖包
3.2.3 设置从stable仓库获取docker
3.2.4 安装Docker
3.2.5 启动Docker(并设置为开机启动)
3.2.6 命令补全
3.2.7 镜像加速(并修改Cgoup Driver)
四、Keepalived安装(master节点安装)
4.1 安装keepalived
4.2 keepalived配置
4.3 启动keepalived
4.4 VIP查看
五、安装k8s(master和node节点都执行)
5.1 查看kubernetes版本
5.2 安装kubelet、kubeadm和kubectl(注意版本号,根据需要进行改变)
5.3 启动kubelet(并设置为开机启动)
5.4 命令补全
5.5 下载镜像
5.6 查看已经下载的镜像
六、网络插件(flannel)配置(Master执行)
6.1 br_netfilter模块加载
6.2 内核参数永久修改
七、初始化Master(Master节点执行)
7.1 创建初始化文件
7.1.1 获取默认的初始化参数文件
7.1.2 查看init.default.yaml文件
7.1.3 配置初始化文件
7.2 初始化kubernetes
7.3 加载环境变量
八、node节点加入集群
8.1 开启Master节点防火墙端口
8.2 加入集群
九、安装网络插件(Master)
十、Client配置(client端执行)
十一、Dashboard搭建(Master端执行)
11.1 下载yaml
11.2 修改镜像地址
11.3 配置yaml
11.4 新增管理员账号
11.5 部署Dashboard
11.6 使用火狐浏览器浏览
十二、查找问题方式
12.1 查看Pod详细信息
12.2 防火墙的问题
12.3 Dashboard 证书过期问题
12.4 Node节点执行kubectl命令出错问题
参考资料
概述:
这篇文章是为了介绍使用kubeadm安装Kubernetes集群(可以用于生产级别)。使用了Centos 7系统。
PS:
篇幅有点长,但是比较详细、比较全面。(请注意文章最后分享的word文档,可以解决DNS的问题)
CentOS Linux 7 默认开起来防火墙服务(firewalld),而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置Kbernetes各组件(api-server、kubelet等等)需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务。
关闭防火墙的命令:
1 # firewall-cmd --state #查看防火墙状态 2 # systemctl stop firewalld.service #停止firewall 3 # systemctl disable firewalld.service #禁止firewall开机启动
如果你不想关闭防火墙,请把以下端口开放(在防火墙开放以下端口)
建议禁用SELinux,让容器可以读取主机文件系统
执行命令:
1 # getenforce #查看selinux状态 2 # setenforce 0 #临时关闭selinux 3 # sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久关闭(需重启系统) 4 # shutdown -r now #重启系统
软硬件 |
最低配置 |
推荐配置 |
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 |
2C2G |
control plane |
work01 |
7.6.1810 |
192.168.0.10 |
18.09.9 |
/ |
/ |
1C2G |
worker nodes |
work02 |
7.6.1810 |
192.168.0.12 |
18.09.9 |
/ |
/ |
1C2G |
worker nodes |
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选装 |
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
2.3.4.1 新增kubernetes源
执行以下命令:
# cat </etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
2.3.4.2 更新缓存
# 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/
简介:
为了保证Master的高可用,会使用多个服务器(作为一个Master集群,一般使用3台服务器,每台服务器都需要安装kube-apiserver、kube-controller-manager、kube-scheduler、etcd等组件),客户端将会通过负载均衡器进行访问kube-apiserver(Master服务器)。在不同的平台下,负载均衡的实现方式不同:公有云一般都有现成的实现方案(这里不进行过多讨论);本地集群,可以选择硬件(例如,F5)或者软件来实现,kubernetes社区推荐方案HAProxy和Keepalived,其中HAProxy负责负载均衡,而Keepalived负责对HAProxy进行监控和故障切换。
说明:
由于只有一台8核机器,这里没有使用master集群,也没有使用HAProxy,但是仍然提供了Keepalived的安装,以便于使用虚拟IP(192.168.0.130),Node节点可以通过该IP进行访问Master,即使其他Master加入之后,也是通过虚拟IP进行访问
# yum -y install keepalived
保留默认配置
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf
写入新的配置
# cat </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/google_containers #阿里云镜像仓库地址,可以按需修改 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 ## 执行以下命令进行安装 # chmod 755 image.sh #给文件授权 # ./image.sh #执行文件
注意:
如果需要下载其他的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 </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
说明:
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 - master01 - node01 - node02 - 192.168.0.6 - 192.168.0.10 - 192.168.0.12 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers 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
如安装网络插件之后,长时间状态没有变更,则可以试试重启机器(或者是虚拟机,这里是指Centos 7系统)。
无,可以用master节点代替
# 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 >> dashboard-adminuser.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
生效service account
# kubectl apply -f dashboard-adminuser.yaml
# kubectl apply -f recommended.yaml
状态查看:
# kubectl get all -n kubernetes-dashboard
令牌查看:
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
令牌为(一定要注意可能存在换行的情况):
说明:
如果安装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之后,由于证书问题导致无法在浏览器浏览
1.简易方法
解决:就是在当前页面用键盘输入 thisisunsafe
注意是直接输入 不要去地址栏输入
2.生成自签名证书:
在master机器上执行如下操作,步骤如下:
mkdir /root/keys
cd /root/keys
openssl genrsa -out dashboard.key 2048
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=10.238.5.37'
# 证书过期时间设置为1年
openssl x509 -req -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
2.1 查询dashboard在那个节点
# kubectl get pod -n kubernetes-dashboard -o wide
2.2 在master01节点上查询kubernetes-dashboard容器ID
# docker ps | grep dashboard
2.3 在master01节点上查询kubernetes-dashboard容器挂载目录
# docker inspect -f {{.Mounts}} 54ec4048250a
2.4 从将证书文件拷贝到master01节点上kubernetes-dashboard容器挂载目录
scp dashboard.csr dashboard.key dashboard.crt /var/lib/kubelet/pods/a0eaacdd-69d1-4a3c-b08b-972c02e2bd27/volumes/kubernetes.io~secret/kubernetes-dashboard-certs
2.5 在master01节点重启kubernetes-dashboard容器
2.6 获取token 重新登录
3. 阅读参考资料(并执行命令,除了删除命令)
解决Kubernetes Dashboard由于自身证书问题导致一些浏览器不能打开的问题_OMCloud的技术博客_51CTO博客
查看所有Pod
# kubectl get pods --all-namespaces
查看Pod日志(使用真实的pod名称,替换pod-name)
# kubectl logs pod-name --all-containers=true
查看状态异常的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的安装:
Centos7.6部署k8s v1.16.4高可用集群(主备模式)_Kubernetes中文社区
CentOS Linux 开放端口:
Centos 7防火墙firewalld开放80端口 - archoncap - 博客园
Kubernetes所有网络插件说明:
Creating a cluster with kubeadm | Kubernetes
PS:
最后分享一个问题的解决方案(在发布网站/应用的时候可能需要),下载
如果您在使用该文章进行安装kubernetes集群时遇到问题,请在下方留言,我看到后会及时回复。
--------------------------------------------------------------------------------------------------------
2020-04-20 补充
官网安装资料:
Kubernetes 安装 kubeadm _ Kubernetes(K8S)中文文档_Kubernetes中文社区(中文版,低版本,作为参考)
使用kubeadm创建Kubernetes集群 _ Kubernetes(K8S)中文文档_Kubernetes中文社区(中文版,低版本,作为参考)
Installing kubeadm | Kubernetes (英文版,最新版本)