目前kubeadm已经成为了可生产使用的部署方式,比较知名的容器云管理平台kubesphere的kk工具也采用了kubeadm方式部署,因此文档也主要以kubeadm方式讲解和记录部署过程。
1. 单主架构部署(kubeadm)
1.1 部署架构图
1.2 主机配置和分配
1.3 主机初始化
#关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
#永久关闭selinux
$ setenforce 0
$ sed -i ‘s/enforcing/disabled/‘ /etc/selinux/config
#永久关闭swap,否则kubelet无法启动
swapoff -a
$ vi /etc/fstab #注释掉swap挂载配置
#设置主机名
$ hostnamectl set-hostname master01
$ hostnamectl set-hostname node01
$ hostnamectl set-hostname node02
#在master节点添加hosts映射关系,并在master节点ping测试
$ cat >> /etc/hosts << EOF
192.168.80.101 master01
192.168.80.102 node01
192.168.80.103 node02
EOF
#内核参数调整
$ cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
# 生效文件
$ sysctl -p /etc/sysctl.d/kubernetes.conf
#sysctl配置生效
$ sysctl --system
#清空服务器自带YUM,并配置公共云源
$ rm -f /etc/yum.repos.d/*.repo
#阿里云
$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7-aliyun.repo
#华为云
$ curl -o /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-huawei.repo
#测试YUM是否配置成功
$ yum -y install wget
#配置时间同步服务,node节点向master进行同步
$ ntpdate time.windows.com
1.4 软件安装和配置
master节点部署Docker、kubeadm、kubelet、kubectl
worker节点部署Docker、kubeadm、kubelet
1. 安装Docker软件
#清理原有版本
$ yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine container-selinux
#配置Docker YUM 源
#阿里云
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#华为云
$ wget https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#安装Docker,建议安装和K8S官方推荐版本,不要过于追求最新版本
$ yum list docker-ce --showduplicates | sort -r #列出当前镜像库的可用版本
$ yum -y install docker-ce-18.06.1.ce-3.el7
#如果不安装Docker,二进制安装会提示 kubelet.service无法找到
#配置开机启动和启动Docker
$ systemctl enable docker && systemctl start docker
#验证安装是否成功
$ docker --version
#设置 Docker daemon 配置
$ mkdir /etc/docker
$ cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
"graph": "/new-path/docker" #如果需要修改默认存储路径则加该参数到JSON里面
#重启Docker应用镜像源配置
$ systemctl daemon-reload && systemctl restart docker
# 官方文档: https://kubernetes.io/docs/setup/cri/
2. 安装K8s套件
#配置阿里云源
$ cat > /etc/yum.repos.d/aliyun-kubernetes.repo << EOF
[aliyun-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
$ yum list kubeadm --showduplicates | sort -r
$ yum install -y kubelet-1.18.1 kubeadm-1.18.1 kubectl-1.18.1
#这个步骤记得执行
$ systemctl enable kubelet
1.5 初始化Master节点
注意: 初始化过程的完成时间受限于主机环境所在的网络条件限制
$ kubeadm init --apiserver-advertise-address=192.168.137.31 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
#说明:
--apiserver-advertise-address #API Server接口地址
--image-repository #国内镜像源,加快部署速度
--kubernetes-version v1.18.0 #kubernetes版本,可以不指定,由工具拉取默认最新版本,建议按照K8s官网描述的兼容Docker版本来部署,如果不了解,可以参考第三方平台文档说明,比如kubesphere
--service-cidr=10.96.0.0/12 #service服务子网段
--pod-network-cidr=10.244.0.0/16 #pod子网段,Flannel网络配置,如果用Calico可以不用指定
- 配置网络插件(Addons)
#下载Flannel网络配置YML
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#修改kube-flannel-ds-amd64节点的镜像源
quay.io/coreos/flannel:v0.12.0-amd64 -> lizhenliang/flannel:v0.11.0-amd64 #一共要修改两个地方
#部署应用
$ kubectl apply -f kube-flannel.yml
#重新检查master节点状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready master 10m v1.18.0
1.6 添加Worker节点
在Master节点初始化输出最后有以下命令需要执行,一个是客户端配置,一个是添加工作节点配置,第二个命令需要到工作节点执行
因为Token值的有效期为24小时,如果过期了需重新生成,关于如何生成请参考这篇文章:
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#join-nodes
1.7 演示测试
1). 部署应用
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-9txzv 1/1 Running 0 44m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
service/nginx NodePort 10.111.74.187 <none> 80:32709/TCP 81s
$ curl -I 192.168.80.103:32709
2). 验证集群网络是否正常
$ kubectl get pod,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-f89759699-9txzv 1/1 Running 0 62m 10.244.1.2 node01 <none> <none>
/ # ping 10.244.1.2
3). DNS解析是否正常
$ kubectl run -it --rm --image=busybox:1.28.4 sh
/ # nslookup nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: nginx #能正常解析nginx 的service
Address 1: 10.111.74.187 nginx.default.svc.cluster.local
1.8 清空环境
如果发现worker节点一直加不进去,建议先清空再重试
$ kubeadm reset #清空当前环境配置
$ rm -rf .kube/ #清空kubectl环境信息
1.9 遇到的问题
1). core dns运行报错
$ kubectl logs -f coredns-8854569d4-mkwz6 -n kube-system
Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log coredns-8854569d4-mkwz6)
$ kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
clusterrolebinding.rbac.authorization.k8s.io/system:anonymous created
修改pod子网地址(这里是取初始化Master节点的时候定义的子网) :kubectl -n kube-system edit cm kubeadm-config
查看pod子网信息kubectl cluster-info dump | grep -m 1 cluster-cidr