Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

目前kubeadm已经成为了可生产使用的部署方式,比较知名的容器云管理平台kubesphere的kk工具也采用了kubeadm方式部署,因此文档也主要以kubeadm方式讲解和记录部署过程。

1. 单主架构部署(kubeadm)

1.1 部署架构图

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

1.2 主机配置和分配

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

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节点初始化输出最后有以下命令需要执行,一个是客户端配置,一个是添加工作节点配置,第二个命令需要到工作节点执行

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

因为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

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

查看pod子网信息kubectl cluster-info dump | grep -m 1 cluster-cidr

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

Kubernetes v1.18.16 版 + 单主架构部署(kubeadm)

上一篇:cube.js 一些预聚合分区新特性


下一篇:Json序列化在golang中的应用