kubeadm方式部署K8S1.20版本
- 建议在安装K8S前,先去把K8S相关概念学习一下,不然可能会比较困惑。还有就是不要直接进行二进制部署,先用kubeadm方式,等对K8S熟悉后再尝试,要多去搜索资料,不要对着一个博客往死里搞,多多去参考其它文章,或者书籍,二进制部署部署内容较多,书写博客需要详细说明,大多数博客没有把细节说清,会让读者进很多坑,建议查看官方文档,或者比较权威的博主。
-
环境准备
本次采用的是kubeadm的部署方式,可以快速部署一个K8S集群。另外,建议在理解了K8S的基础知识和熟悉后,搭建一套二进制版K8S集群进行深度理解。
环境:宿主机windows10
虚拟机:vmware,网络nat,最低2核,2G内存,25G磁盘
建议分区:/20G, /var分3G以上,/boot分500m以上,理论上没有别的需求足够了,swap可以不要。
服务器需要能够上网。
软件环境:
操作系统:centos7.6,建议最小化安装节省资源。
容器引擎:docker ce 19
Kubernetes:kubernetes v1.20
服务器规划
角色
IP
组件
k8smaster
192.168.222.15
Docker,etcd,kubectl,kubelet,kubeadm
node1
192.168.222.16
Docker,kubelet,kubeadm
node2
192.168.222.17
Docker,kubelet,kubeadm
注意:版本的选择注意要查看官方指引,高版本K8S,可能需要的docker版本会高点,linux内核可能会要求4以上。这个就需要自行去考查了。
-
系统初始化(所有主机都要做)
关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -i 's/enforcing/disabled/' /etc/selinux/config #会永久关闭 setenforce 0 #临时关闭 关闭swap swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 设置主机名 hostnamectl set-hostname <hostname> 添加hosts cat >> /etc/hosts << EOF 192.168.222.15 k8smaster 192.168.222.16 k8snode1 192.168.222.17 k8snode2 EOF 将桥接的IPV4流量传递到iptables链 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF sysctl –system #生效 #时间同步 yum install ntpdate -y ntpdate time.windows.com
#安装系统基础命令
建议安装lrzsz,wget等需要用到的命令。这里自行去安装。
-
安装docker(所有机器安装)
这里采用docker引擎,其它还有containerd等
下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
找个目录存放
tar zxvf docker-19.03.9.tgz
mv docker/* /usr/bin加入system管理
cat > /usr/lib/systemd/system/docker.service << EOF [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF 创建dockerjson配置文件 mkdir /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF
此处的镜像地址为阿里云加速器,如果默认,那么可能需要访问国外网络拉去镜像,速度方面会比较差,有些镜像甚至无法访问拉取。
设置开机启动
systemctl daemon-reload
systemctl start docker
systemctl enable docker -
配置阿里云YUM软件源:
1 cat > /etc/yum.repos.d/kubernetes.repo << EOF 2 3 [kubernetes] 4 5 name=Kubernetes 6 7 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 8 9 enabled=1 10 11 gpgcheck=0 12 13 repo_gpgcheck=0 14 15 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 16 17 EOF 18 19 20 21 #此处是K8S软件源
-
安装kubeadm,kubelet,kubectl(除了主节点都要安装,其余节点不安装kubectl)
yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
注意要指定版本,不然默认最新版本。
systemctl enable kubelet
注意:先不要启动,启动也会报错。需要等到初始化完成后在启动即可。
kubeadm config print init-default >init.default.yaml
生成初始化配置文件,然后可以改名或者不改。可以根据需求更改,然后进行初始化。
或者可以直接使用初始化命令指定需求,直接进行初始化。
其中一般更改选项如下图:192.168.222.15为master的IP,还有镜像地址,pod网段,版本,下载的啥版本填啥
准备好初始化文件后开始初始化,
kubeadm init –config=init-config.yaml
如下图:出现successfully的话代表你初始化集群成功了。
然后下面还有指引你把node节点加入集群的指引的token和哈希密钥
拷贝kubectl使用的连接证书到默认路劲,同时把kubelet启动,systemctl start kubelet,查看状态是否正常。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config -
把node节点加入集群
根据初始化后的指引,在其余node节点执行
kubeadm join 192.168.222.15:16443 --token 9037x2.tcaqnpaqkra9vsbw \
--discovery-token-ca-cert-hash sha256:e6a724bb7ef8bb363762fbaa088f6eb5975e0c654db038560199a7063735a697默认的token只有24小时的有效期,如果是测试环境可以生成一个永久的。生产环境临时较为安全。
注意:node节点上的docker和kubelet进程状态要查看是否正常,kubelet进程要等到初始化后,网络组件部署后会恢复。
-
部署网络组件calico
目前主流的网络组件是calico,安装这个即可。注意这里来是要拉去镜像和创建pod,所以要等待一下我网络慢点等了十分钟左右,并去查看其pod处于什么状态,只有running状态才是正常。如果长时间处于某种状态,说明网络或者是配置出现问题,要去查看pod日志:kubectl logs -f <pod_name> -n namespace namespace为名称空间,查看集群所有的namespace,kubectl get namespaces ,查看指定的namesapce下的pod
# 获取 kube-system命名空间下所有pods信息
kubectl get pods -n kube-system -
wget https://docs.projectcalico.org/manifests/calico.yaml 可能会显示不安全,可以按照指示加上参数,避免这个问题。这里下载好后,我测试1.20版本并不需要更改配置。
kubectl apply -f calico.yaml
kubectl get pods -n kube-system只有等到calico网络组件的pod都显示running,node的状态才会变成Ready。证明集群网络通畅了。
-
部署dashboard
dashboard是官方提供的可视化web,可以管理集群资源。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
kubectl apply -f kubernetes-dashboard.yaml
# 查看部署
kubectl get pods -n kubernetes-dashboard如果wget下载不了,可以输入网址在电脑上下载好,需要FQ。还有就是注意版本问题,一般2.0版本以上支持K8S1.20.
指定NodePort方式暴露端口,指定为30001,可以为其它。输入以下命令。
kubectl patch svc kubernetes-dashboard \
-n kubernetes-dashboard \
-p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30001}]}}'
或者是在kubernetes-dashboard文件中直接配置。
然后就可以在电脑上直接用https://NODE_IP:30001访问了。
创建dashboard-adminuser.yaml:
cat > dashboard-adminuser.yaml << EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF
创建用户
kubectl apply -f dashboard-adminuser.yaml
说明:上面创建了一个叫admin-user的服务账号,并放在kubernetes-dashboard 命名空间下,并将cluster-admin角色绑定到admin-user账户,这样admin-user账户就有了管理员的权限。默认情况下,kubeadm创建集群时已经创建了cluster-admin角色,我们直接绑定即可。
查看admin-user账户的token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
-
使用上面的token登录。