1 服务器虚拟机准备

IP地址 节点角色 CPU Memory Hostname
192.168.200.21 master and etcd >=2c >=2G master
192.168.200.22 worker >=2c >=2G node1
192.168.200.23 worker >=2c >=2G node2

注意:hostname不能有大写字母,比如Master这样。

2 软件版本

系统类型 Kubernetes版本 docker版本 kubeadm版本 kubectl版本 kubelet版本
CentOS7.5.1804 v1.17.4 19.03.8-ce v1.17 v1.17.4 v1.17.4

注意:这里采用的软件版本,请大家严格保持一致! 开源软件,版本非常敏感和重要!
Kubernetes 版本查阅地址:https://github.com/kubernetes/kubernetes/releases

3 服务器环境初始化操作

3.1 配置hostname

  1. hostnamectl set-hostname master
  2. hostnamectl set-hostname node1
  3. hostnamectl set-hostname node2

每台机器上设置对应好hostname,注意,不能有大写字母

3.2 配置/etc/hosts

注意hosts文件非常重要,请在每个节点上执行

  1. 192.168.200.21 master
  2. 192.168.200.22 node01
  3. 192.168.200.23 node02

3.3 关闭防火墙、selinux、swap

3.3.1 关闭防火墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld

3.3.2 关闭Selinux

  1. setenforce 0
  2. sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
  3. sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  4. sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
  5. sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config

3.3.3 关闭Swap

  1. swapoff a
  2. sed -i 's/.*swap.*/#&/' /etc/fstab

3.3.4 加载br_netfilter

  1. modprobe br_netfilter

3.4 配置内核参数

3.4.1 配置sysctl内核参数

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

3.4.2 生效配置文件

  1. sysctl -p /etc/sysctl.d/k8s.conf

3.4.3 调高ulimit最大打开数和systemctl管理的服务文件最大打开数

  1. echo "* soft nofile 655360" >> /etc/security/limits.conf
  2. echo "* hard nofile 655360" >> /etc/security/limits.conf
  3. echo "* soft nproc 655360" >> /etc/security/limits.conf
  4. echo "* hard nproc 655360" >> /etc/security/limits.conf
  5. echo "* soft memlock unlimited" >> /etc/security/limits.conf
  6. echo "* hard memlock unlimited" >> /etc/security/limits.conf
  7. echo "DefaultLimitNOFILE=1024000" >> /etc/systemd/system.conf
  8. echo "DefaultLimitNPROC=1024000" >> /etc/systemd/system.conf

3.5 配置CentOS YUM源等

3.5.1 配置国内yum源地址、epel源地址

  1. yum install -y wget
  2. mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
  3. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
  4. wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
  5. yum clean all && yum makecache

3.5.2 配置国内Kubernetes源地址

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

3.6 安装依赖软件包

有些依赖包我们要把它安装上,方便到时候使用

  1. yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp bash-completion yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools vim libtool-ltdl

3.6.1 时间同步配置

Kubernetes是分布式的,各个节点系统时间需要同步对应上。

  1. yum install chrony y
  2. systemctl enable chronyd.service && systemctl start chronyd.service && systemctl status chronyd.service
  3. chronyc sources

运行date命令看下系统时间,过一会儿时间就会同步。

3.6.2 配置master到node节点间ssh互信

配置ssh互信,那么节点之间就能无密访问,方便日后执行自动化部署

  1. ssh-keygen
  2. #一路回车...
  3. ssh-copy-id node1
  4. ssh-copy-id node2

3.6.3 初始化环境配置检查

  • 重启,做完以上所有操作,最好reboot重启一遍
  • ping 每个节点hostname 看是否能ping通
  • ssh 对方hostname看互信是否无密码访问成功
  • 执行date命令查看每个节点时间是否正确
  • 执行 ulimit -Hn 看下最大文件打开数是否是655360
  • cat /etc/sysconfig/selinux |grep disabled 查看下每个节点selinux是否都是disabled状态

4 Dcoker安装

4.1 卸载旧版本docker

  1. sudo yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine

4.2 设置国内docker yum源

  1. wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.3 设置存储库

  1. sudo yum install -y yum-utils device-mapper-persistent-data lvm2

4.4 列出docker版本

  1. yum list docker-ce --showduplicates | sort -r

4.5 安装docker 指定19.03.8版本

  1. sudo yum install docker-ce-19.03.8-3.el7 docker-ce-cli-19.03.8-3.el7 containerd.io

4.6 配置加速器

  1. mkdir -p /etc/docker
  2. tee /etc/docker/daemon.json << EOF
  3. {
  4. "registry-mirrors": ["https://xad6i9zy.mirror.aliyuncs.com"],
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "log-opts": {
  7. "max-size": "500m",
  8. "max-file": "3"
  9. }
  10. }
  11. EOF

从上到下包含了镜像下载加速器、k8s初始化警告(detected “cgroupfs” as the Docker cgroup driver)、日志切割

4.7 启动Docker

  1. systemctl enable docker;systemctl start docker;systemctl status docker

5 安装kubeadm、kubelet、kubectl

这一步是所有节点都得安装(包括node节点)

5.1 工具说明

• kubeadm: 部署集群用的命令
• kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
• kubectl: 集群管理工具

5.2 yum 安装工具

  1. yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

5.3 启动kubelet

  1. systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
  2. 注意:kubelet 服务会暂时启动不了,先不用管它。

6 Kubernetes部署

6.1 部署master节点

6.1.1 初始化

  1. kubeadm init --kubernetes-version=1.17.4 \
  2. --apiserver-advertise-address=192.168.200.21 \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --service-cidr=10.1.0.0/16 \
  5. --pod-network-cidr=10.244.0.0/16
  • —apiserver-advertise-address 地址就是master本机IP地址
  • —image-repository 指定镜像仓库
  • —pod-network-cidr 定义POD的网段为: 10.244.0.0/16

这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址,很多初次部署的同学都卡在此环节无法进行后续配置,所以借助image-repository参数,即可正常下载国外镜像,稍微等一下就能看成功信息(下载也是需要时间滴)。
image.png
集群初始化成功后返回如下信息:

  1. .....
  2. [addons] Applied essential addon: CoreDNS
  3. [addons] Applied essential addon: kube-proxy
  4. Your Kubernetes control-plane has initialized successfully!
  5. To start using your cluster, you need to run the following as a regular user:
  6. mkdir -p $HOME/.kube
  7. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  8. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  9. You should now deploy a pod network to the cluster.
  10. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  11. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  12. Then you can join any number of worker nodes by running the following on each as root:
  13. kubeadm join 192.168.200.21:6443 --token esy478.u640ppo7klk0tug3 \
  14. --discovery-token-ca-cert-hash sha256:4095864515bf4a23ec1256d7356d48fa23e77a2582e9639329d56fbab0fc5766

记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行

6.2 新增节点

init生成的token24小时后会失效,后期新增需要重新创建token

  1. kubeadm join 192.168.200.21:6443 --token esy478.u640ppo7klk0tug3 \
  2. --discovery-token-ca-cert-hash sha256:4095864515bf4a23ec1256d7356d48fa23e77a2582e9639329d56fbab0fc5766

该章节参考命令:

  • kubeadm token list 查看token
  • kubeadm token create 重新生成新的token

image.png

6.3 验证测试

6.3.1 配置kubectl命令

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

6.3.2 执行获取pods列表命令,查看相关状态

  1. kubectl get pods --all-namespaces

image.png
其中coredns pod处于Pending状态,这个先不管。

我们也可以执行 kubectl get cs 查看集群的健康状态:
image.png
查看节点状态
image.png

6.4 部署网络

不部署网络节点状态为NotReady

6.4.1 flannel

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

至此,Master 节点初始化完毕,查看集群相关信息:

  1. # 查看集群信息
  2. $ kubectl cluster-info
  3. Kubernetes master is running at https://192.168.200.21:6443
  4. KubeDNS is running at https://192.168.200.21:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  5. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  1. # 查看节点信息
  2. $ kubectl get nodes
  3. NAME STATUS ROLES AGE VERSION
  4. cfdemo1 Ready master 34m v1.17.4
  5. cfdemo2 Ready <none> 31m v1.17.4
  6. cfdemo3 Ready <none> 31m v1.17.4
  1. # 查看 Pods 信息
  2. $ kubectl get pods --all-namespaces
  3. NAMESPACE NAME READY STATUS RESTARTS AGE
  4. kube-system coredns-9d85f5447-f8fk6 1/1 Running 0 34m
  5. kube-system coredns-9d85f5447-rzsb5 0/1 Running 0 34m
  6. kube-system etcd-cfdemo1 1/1 Running 0 34m
  7. kube-system kube-apiserver-cfdemo1 1/1 Running 0 34m
  8. kube-system kube-controller-manager-cfdemo1 1/1 Running 0 34m
  9. kube-system kube-flannel-ds-amd64-7rq5m 1/1 Running 0 6m
  10. kube-system kube-flannel-ds-amd64-lz4pk 1/1 Running 0 6m
  11. kube-system kube-flannel-ds-amd64-ww4wg 1/1 Running 0 6m
  12. kube-system kube-proxy-bfngd 1/1 Running 0 34m
  13. kube-system kube-proxy-bvd54 1/1 Running 0 31m
  14. kube-system kube-proxy-cqbmd 1/1 Running 0 31m
  15. kube-system kube-scheduler-cfdemo1 1/1 Running 0 34m

6.5 创建Pod验证集群是否正常

  1. kubectl create deployment nginx --image=nginx
  2. kubectl expose deployment nginx --port=80 --type=NodePort
  3. kubectl get pod,svc

6.6 重置初始化

如果初始化过程出现问题,使用如下命令重置:

  1. kubeadm reset
  2. rm -rf /var/lib/cni/
  3. rm -f $HOME/.kube/config

7 部署Dashboard

部署dashboard之前,我们需要生成证书,不然后面会https访问登录不了。
Kubernetes集群基于Web的通用UI。它允许用户管理集群中运行的应用程序并对其进行故障排除,以及管理集群本身。

7.1 生成私钥和证书签名请求

  1. #创建单独命名空间
  2. $ kubectl create namespace kubernetes-dashboard
  3. #创建私钥目录
  4. $ mkdir $HOME/certs && cd $HOME/certs
  5. #生成私钥
  6. openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
  7. openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
  8. rm -rf dashboard.pass.key
  9. #生成csr证书签名请求
  10. openssl req -new -key dashboard.key -out dashboard.csr
  11. #生成自签名的ssl证书
  12. openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

7.2 创建 ssl 证书 secret

  1. kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kubernetes-dashboard

7.2.1 describe secrets

  1. kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-certs

7.3 修改yaml

7.3.1 配置私有证书

注释掉原有证书,启用私有证书
image.png

  1. containers:
  2. - args:
  3. - --tls-cert-file=/dashboard.crt
  4. - --tls-key-file=/dashboard.key
  5. - --token-ttl=3600

image.png

7.3.2 添加暴露端口

image.png

7.4 部署 k8s dashboard

  1. kubectl apply -f recommended.yaml

7.4.1 查看状态

Dashboard地址:https://$IP:30001

  1. kubectl get pods -n kubernetes-dashboard
  2. kubectl get svc --all-namespaces -o wide

7.4.2 创建登陆用户

创建 admin-user 管理员 yaml 配置

  1. cat > create-admin.yaml <<EOF
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: admin-user
  6. namespace: kubernetes-dashboard
  7. ---
  8. apiVersion: rbac.authorization.k8s.io/v1
  9. kind: ClusterRoleBinding
  10. metadata:
  11. name: admin-user
  12. roleRef:
  13. apiGroup: rbac.authorization.k8s.io
  14. kind: ClusterRole
  15. name: cluster-admin
  16. subjects:
  17. - kind: ServiceAccount
  18. name: admin-user
  19. namespace: kubernetes-dashboard
  20. EOF

7.4.3 创建用户

  1. $ kubectl apply -f create-admin.yaml

7.4.4 获取token

  1. $ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

7.5 登录验证

image.png