服务器准备

机器名 IP地址 cpu和内存要求
p-master01 172.17.3.141 4c8g
p-worker01 172.17.3.142 4c8g

本文服务器系统为:CentOS Linux release 7.9.2009 (Core)

1、系统环境准备【所有节点】

1)关闭防火墙

由于k8s自己搞防火墙规则,如果不关闭服务器上的防火墙,会导致和集群的防火墙规则冲突。

systemctl stop firewalld

systemctl disable firewalld

2)关闭selinux

Selinux是内核级别的一个安全模块,通过安全上下文的方式控制应用服务的权限,是应用和操作系统之间的一道ACL,但不是所有的程序都会去适配这个模块。

sed -i ‘s/enforcing/disabled/‘ /etc/selinux/config

setenforce 0

3)关闭swap

需要禁止各个节点启用swap,如果启用了swap,那么kubelet就无法启动。

1、临时关闭

swapoff -a

2、永久关闭,把加载swap分区的那行记录注释掉即可

vim /etc/fstab

#

/etc/fstab

Created by anaconda on Mon Jun 7 18:59:32 2021

#

Accessible filesystems, by reference, are maintained under ‘/dev/disk’

See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

# UUID=a0fa805f-2512-48d7-b090-7db84ec75155 / xfs defaults 0 0

UUID=ecc05989-cf63-4539-b88a-ffb5f9406fa2 swap swap defaults 0 0

4)时间同步

容器集群对时间同步要求高,分布式系统对于时间极为敏感,不允许出现时间误差,实际使用环境中必须确保集群中所有系统时间保持一致;
时间同步服务包括服务器端和客户端,可任意选择其中一台作为服务器端,其他皆为客户端。

服务端:

  1. yum install -y ntp ntpdate
  2. cp /etc/ntp.conf /etc/ntp.conf.bak
  3. #修改etc/ntp.conf,注释所有的server和restrict,加入:
  4. --------------------------------------------------
  5. restrict 0.cn.pool.ntp.org nomodify notrap noquery
  6. restrict 0.asia.pool.ntp.org nomodify notrap noquery
  7. restrict 3.asia.pool.ntp.org nomodify notrap noquery
  8. server 0.cn.pool.ntp.org
  9. server 0.asia.pool.ntp.org
  10. server 3.asia.pool.ntp.org
  11. server 127.127.1.0 # local clock
  12. fudge 127.127.1.0 stratum 10
  13. -------------------------------------------------
  14. #启动服务
  15. systemctl enable ntpd
  16. systemctl disable chronyd
  17. systemctl restart ntpd
  18. ntpdate -u s1a.time.edu.cn

客户端:

  1. yum install -y ntp ntpdate
  2. vim /etc/ntp.conf
  3. #添加下面内容
  4. ---------------------
  5. server 172.17.3.141 prefer
  6. -------------------
  7. #启动服务
  8. systemctl enable ntpd
  9. systemctl disable chronyd
  10. systemctl restart ntpd
  11. 同步:
  12. ntpdate -u 172.17.3.141
  13. 把系统时间同步到硬件BIOS
  14. hwclock --systohc
  15. #服务器时间不同步会导致kube api-server 频繁重启。

5)host绑定

下面主机名可以自己设定,为了区分控制节点和工作节点,可以参考下面

cat <> /etc/hosts

172.17.3.141 p-master01 172.17.3.142 p-worker01 EOF

6)#优化linux系统网络内核,所有节点执行

cat < /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF

sysctl —system

2、更改主机名

  1. #master节点
  2. echo "p-master01" >/etc/hostname
  3. hostname p-master01
  4. #worker节点
  5. echo "p-worker01" >/etc/hostname
  6. hostname p-worker01

3、更新yum安装源【所有节点】

  1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  3. yum makecache
  4. yum -y update

4、安装指定版本docker【所有节点】

  1. curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  2. wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
  3. sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  4. yum list docker-ce --showduplicates
  5. #安装指定版本的docker
  6. yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 -y
  7. systemctl start docker && systemctl enable docker

5、安装kubeadm【所有节点】

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=kubernetes
  4. baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-$basearch
  5. enabled=1
  6. EOF
  7. yum install kubelet-1.15.5-0 kubeadm-1.15.5-0 kubectl-1.15.5-0 -y
  8. systemctl enable kubelet && systemctl start kubelet

如果安装过程中出现安装失败的问题,可以更换安装源来解决。

6、使用kubeadm初始化k8s集群【master节点】

  1. #控制节点上运行,注意保存最后其他node节点加入集群的输出;注意修改网络地址段
  2. kubeadm init --kubernetes-version=v1.15.5 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=172.244.0.0/16 --service-cidr=172.254.0.0/16
  3. mkdir -p $HOME/.kube
  4. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. chown $(id -u):$(id -g) $HOME/.kube/config

整个初始化过程会下载master节点组件kube-apiserver,kube-controller-manager,kube-proxy,kube-scheduler等镜像并启动pod服务,根据网络不一,约5-10分钟左右。

7、为k8s集群配置网络插件【master节点】

  1. #master 节点执行
  2. cd /etc/kubernetes/ && wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  3. #修改网段范围为
  4. kubectl create -f kube-flannel.yml
  5. kubectl get all -n kube-system
  6. kubectl get nodes

如果链接中kube-flannel.yml下载失败,可以参考使用下面附件中的文件。
kube-flannel.yml

8、worker节点加入k8s集群【worker节点】

  1. #worker节点上执行,前面控制节点提示的加入命令(此处命令从第七步结果获得)
  2. kubeadm join 172.17.3.141:6443 --token 2q1dxt.cl2dhvc48gicwx30 \
  3. --discovery-token-ca-cert-hash sha256:53a60c987521e4b6b443b981a56b8d5941b4d14bc4925125f3655cf0a2b9dd22

worker工作节点加入集群网络后,会进行网络插件[如kube-proxy,flannel等]的镜像下载,安装。所有准备工作结束后,在控制节点上查询node信息,会发现新加入的工作节点已经Ready。

  1. # kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. p-master01 Ready master 21h v1.15.5
  4. p-worker01 Ready <none> 20h v1.15.5

9、测试

  1. #a、master 节点上创建yaml文件nginx_demo.yaml
  2. $ vim nginx_demo.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6. name: nginx-demo
  7. namespace: default
  8. labels:
  9. k8s-app: nginx
  10. environment: dev
  11. annotations:
  12. name: nginx-demo
  13. spec:
  14. containers:
  15. - name: nginx
  16. image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17
  17. imagePullPolicy: IfNotPresent
  18. ports:
  19. - name: httpd
  20. containerPort: 80
  21. hostPort: 8090
  22. protocol: TCP
  23. volumeMounts:
  24. - name: nginx-site
  25. mountPath: /usr/share/nginx/html
  26. readOnly: false
  27. - name: nginx-log
  28. mountPath: /var/log/nginx/
  29. readOnly: false
  30. volumes:
  31. - name: nginx-site
  32. hostPath:
  33. path: /data/volumes/nginx/html/
  34. type: DirectoryOrCreate
  35. - name: nginx-log
  36. hostPath:
  37. path: /data/volumes/nginx/log/
  38. type: DirectoryOrCreate
  39. #b、创建nginx测试pod
  40. $ kubectl apply -f nginx_demo.yaml
  41. 执行结束后会发现被调度pod所在的节点服务器上的/data/volumes/nginx/下新被创建两个文件夹htmllog
  42. #c、被调度服务器上创建访问页面
  43. $ vim /data/volumes/nginx/html/index.html
  44. <h1>hello mi ya....</h1>
  45. #d、浏览器访问
  46. http://节点服务IP:8090/

image.png