kubeadm快速部署一套K8S集群
1.kubeadm介绍
官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点 $ kubeadm init # 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口 >
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
-
一台或多台机器,操作系统 CentOS7.x-86_x64
-
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
-
集群中所有机器之间网络互通
-
可以访问外网,需要拉取镜像
-
3.2 环境规划
| IP | 角色 | 安装软件 | Docker版本 | k8s版本 |
|---|---|---|---|---|
| 10.3.104.51 | k8s-master |
kube-apiserver |
docker-ce-19.03.11 |
v1.19.0 |
| 10.3.104.52 | k8s-node01 | kubelet kube-proxy docker flannel |
docker-ce-19.03.11 |
v1.19.0 |
| 10.3.104.56 | k8s-node01 | kubelet kube-proxy docker flannel |
docker-ce-19.03.11 |
v1.19.0 |
3.3 环境初始化(每个节点都执行)
1)关闭防火墙: # systemctl stop firewalld # systemctl disable firewalld 2)关闭selinux: # setenforce 0 #临时 # sed -i 's/enforcing/disabled/' /etc/selinux/config #永久 3)关闭swap: # swapoff -a #临时 # sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久 4)设置主机名(hostname根据环境规划修改): # hostnamectl set-hostname <hostname> 5)添加hosts: # cat >> /etc/hosts << EOF 10.3.104.51 k8s-master 10.3.104.52 k8s-node1 10.3.104.56 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 # sysctl --system #生效 7)时间同步: # yum install ntpdate -y # ntpdate time.windows.com 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-19.03.11 # systemctl enable docker && systemctl start docker 9)配置镜像下载加速器: # cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF # systemctl restart docker 10)添加阿里云YUM软件源 # cat > /etc/yum.repos.d/kubernetes.repo << EOF [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
11)安装kubeadm,kubelet和kubectl工具
# yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0
# systemctl enable kubelet
注:安装好之后不要直接启动kubelet,因为还没有配置文件,kubeadm没有帮你生成其配置文件,只有kebeadm执行完成才有该配置文件,并且kubeadm会自动帮你拉起kubelet。所以这里只需要设置开机启动就行
所有节点都会有 kubelet kubeadm kubectl这三个工具,Kubectl(管理k8s集群工具)实际上在mater安装就行,只不过在node节点安装了不使用罢了
[root@k8s-master ~]# kubeadm init \ --apiserver-advertise-address=10.3.104.51 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.19.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all
-
-
--image-repository #由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
-
--kubernetes-version #K8s版本,与上面安装的一致
-
--service-cidr #service网段,集群内部虚拟网络,Pod统一访问入口
-
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 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/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.3.104.51:6443 --token span8l.3rp0qcjy4obwjis4 \ --discovery-token-ca-cert-hash sha256:e0c81cd4d8c10e6a9acf3d1811353cf24cdcc23d7065437f329c57ae4e74c135
3)拷贝kubectl使用的连接k8s认证文件到默认路径
这一步是将连接集群的配置文件拷贝到默认路径下,好使用命令行工具去管理集群。也就是使用kubectl去管理集群了(如果不拷贝这个文件是无法使用kubectl这个命令管理集群)
[root@k8s-master ~]# mkdir -p $HOME/.kube [root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady master 10m v1.19.0
[root@k8s-master ~]# kubeadm join 10.3.104.51:6443 --token span8l.3rp0qcjy4obwjis4 \ --discovery-token-ca-cert-hash sha256:e0c81cd4d8c10e6a9acf3d1811353cf24cdcc23d7065437f329c57ae4e74c135
注:默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
直接命令快捷生成:kubeadm token create --print-join-command
3.6 Master节点检查集群状态
[root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady master 21m v1.19.0 k8s-node1 NotReady <none> 7m41s v1.19.0 k8s-node2 NotReady <none> 6s v1.19.0
注:集群Status为NotReady,需要安装网络插件
网络插件calico和flannel均可(二选一),flannel.yaml地址:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# wget https://docs.projectcalico.org/manifests/calico.yaml
2)修改CALICO_IPV4POOL_CIDR为自定义地址
该地址与kubeadm init指定pod-network-cidr一致

3)安装calico网络插件
[root@k8s-master ~]# kubectl apply -f calico.yaml [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 52m v1.19.0 k8s-node1 Ready <none> 39m v1.19.0 k8s-node2 Ready <none> 31m v1.19.0 [root@k8s-master ~]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-97769f7c7-2pxvz 1/1 Running 0 2m28s calico-node-5fgr2 1/1 Running 0 2m28s calico-node-9kvrq 1/1 Running 0 2m28s calico-node-wsljm 1/1 Running 0 2m28s coredns-6d56c8448f-7cdt9 1/1 Running 0 52m coredns-6d56c8448f-gzx9n 1/1 Running 0 52m etcd-k8s-master 1/1 Running 0 52m kube-apiserver-k8s-master 1/1 Running 0 52m kube-controller-manager-k8s-master 1/1 Running 0 52m kube-proxy-j4hrv 1/1 Running 0 39m kube-proxy-rxzzn 1/1 Running 0 31m kube-proxy-wcj49 1/1 Running 0 52m kube-scheduler-k8s-master 1/1 Running 0 52m
注:如果失败,请执行:kubectl delete -f calico.yaml回滚
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed [root@k8s-master ~]# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-4zcgk 1/1 Running 0 39s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 57m service/nginx NodePort 10.98.80.78 <none> 80:30099/TCP 10s
2)访问地址:http://NodeIP:Port

yaml文件链接:https://pan.baidu.com/s/1mm4J50q5SsCFWziE9iKt0w
提取码:zldn
[root@k8s-master ~]# kubectl apply -f kubernertes-dashboard.yaml [root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-7b59f7d4df-xkgc2 1/1 Running 0 46s kubernetes-dashboard-5dbf55bd9d-8gkx9 1/1 Running 0 46s [root@k8s-master ~]# kubectl get svc -n kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.105.206.181 <none> 8000/TCP 91s kubernetes-dashboard NodePort 10.100.59.174 <none> 443:30001/TCP 91s
2)访问地址:https://NodeIP:30001

[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system serviceaccount/dashboard-admin created [root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created [root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') Name: dashboard-admin-token-hzj8v Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: dashboard-admin kubernetes.io/service-account.uid: 2074c25a-5453-4bbe-821a-16008cc4b7be Type: kubernetes.io/service-account-token Data ==== token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlUxMGhQcmJ2eThSS2JXbzRNVlBRRmJ3NmdQcnZaQl85U2l0V09RQ0tJZWsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4taHpqOHYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMjA3NGMyNWEtNTQ1My00YmJlLTgyMWEtMTYwMDhjYzRiN2JlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.g51Ip2uYMK_Oet1Y7ehM5M4QMqI1aPqMyRoMNFZzK6qVL8cA_PVjGdH5YN-4BaMQMHm0un-VwkbLzEYuG6erDd8yoaRw5q-HRwqg-AzMiAeMF-P9y3ccfKVXkWtN9eY_ZWWE9po7yzS14SElIQQRPddUR0s-_yCUrNcgzTfNenMaxwyBbg_UUVnUL2ae1AiyUYHZpUhdAgrXT34fHBuhsYm14hSKVRg9vAdvXKVnBUBrxgNUR9sdOZ9lg3FkzrOLdLYb8M77wSCP39IBs-flOL0OHSjXopbm0q06axdHrvAxDD9NM2tf3gwI-6tMcQsWYdR07eMPS8_-glKrLS7jhw ca.crt: 1066 bytes namespace: 11 bytes
4)使用输出的token登录Dashboard



浙公网安备 33010602011771号