k8s 集群安装 - 保姆级

190 阅读3分钟

说明:k8s 概念太多太杂,不过在安装之前还是建议把概念弄清楚再来安装,不然每一步安装都会云里雾里的。

1、准备工作

准备三台可联网虚拟机,操作系统为 CentOS7 最小安装,用处如下:

  • k8s-master-01:192.168.146.100
  • k8s-node-01:192.168.146.101
  • k8s-node-02:192.168.146.102
# 网络配置
$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3934a62f-3faa-4a6c-81f4-8d8cd7cebac4
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.146.100
NETMASK=255.255.255.0
GATEWAY=192.168.146.2
DNS1=8.8.8.8

2、环境设置

2.1 设置主机名及IP映射

# 192.168.146.100 上设置
$ vi /etc/hostname
k8s-master-01
​
# 192.168.146.101 上设置
$ vi /etc/hostname
k8s-node-01
​
# 192.168.146.102 上设置
$ vi /etc/hostname
k8s-node-02
​
# 设置好之后,可以查看每一台虚拟机的主机名
$ hostname# 三台虚拟机上都要做以下映射设置
$ vi /etc/hosts
192.168.146.100 k8s-master-01
192.168.146.101 k8s-node-01
192.168.146.102 k8s-node-02

2.2 依赖安装,便于后续操作

# 三台虚拟机都需要安装
$ yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute bash-completion tree bridge-utils unzip bind-utils gcc

2.3 对刚才的安装进行设置

# 三台虚拟机都需要设置
### 关闭防火墙
$ systemctl stop firewalld && systemctl disable firewalld### 启动 iptables / 置空 iptables / 清空 iptables 规则 并保存
$ yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save### 关闭 swap 分区
$ swapoff -a && sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab### 关闭 selinux
$ setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.4 升级内核

# 三台虚拟机都需要升级
# k8s 在 Linux 内核 4.0 以上更加稳定,防止在安装过程中出现系统级问题
### 查看当前内核
$ uname -r
3.10.0-1160.59.1.el7.x86_64 (不满足我们的要求)
​
### 升级
$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
### 安装内核
$ yum --enablerepo=elrepo-kernel install -y kernel-lt### 5.4.187-1.el7.elrepo.x86_64 这个版本 在 安装内核 中会在屏幕上显示,根据自己显示的版本替换
### 设置开机从新内核启动
$ grub2-set-default 'CentOS Linux (5.4.187-1.el7.elrepo.x86_64) 7 (Core)'### 重启后查看内核版本
$ uname -r
5.4.187-1.el7.elrepo.x86_64

2.5 调整内核参数

# 三台虚拟机都需要调整
$ cat > kubernetes.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
​
### 将上一步的调整参数文件放到 /etc/sysctl.d/ 下面,开机调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
​
### 手动刷新,立即生效,否则就要重启系统
$ sysctl -p /etc/sysctl.d/kubernetes.conf

2.6 设置系统时区和时间

# 三台虚拟机都需要设置
$ timedatectl set-timezone Asia/Shanghai### 重启时间相关服务
$ systemctl restart rsyslog
$ systemctl restart crond

2.7 关闭不需要的服务

# 三台虚拟机都需要关闭
$ systemctl stop postfix && systemctl disable postfix

2.8 设置日志保存方式

# 三台虚拟机都需要关闭
### 日志目录
$ mkdir /var/log/journal### 配置文件存放目录
$ mkdir /etc/systemd/journald.conf.d### 设置配置文件
$ cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
> [Journal]
> Storage=persistent
> Compress=yes
> SyncIntervalSec=5m
> RateLimitInterval=30s
> RateLimitBurst=1000
> SystemMaxUse=10G
> SystemMaxFileSize=200M
> MaxRetentionSec=2week
> ForwardToSyslog=no
> EOF### 重启 systemd journald 的配置
systemctl restart systemd-journald

2.9 kube-proxy 开启 ipvs 的前提设置

# 三台虚拟机都需要关闭
$ modprobe br_netfilter$ cat > /etc/sysconfig/modules/ipvs.modules <<EOF
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack_ipv4
> EOF### 设置权限/执行/查看文件是否被引导
$ chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

3、Docker部署

说明:三台虚拟机都需要安装、部署 Docker

3.1 安装 Docker

$ yum install -y yum-utils device-mapper-persistent-data lvm2

# 建议配置一个国内的仓库
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

$ yum update -y && yum install -y docker-ce

3.2 设置 Docker daemon 文件

# 创建目录用来存放 daemon.json
$ mkdir /etc/docker

$ cat > /etc/docker/daemon.json <<EOF
> {"exec-opts":["native.cgroupdriver=systemd"],"log-driver":"json-file","log-opts":{"max-size":"100m"}}
> EOF

# 存储 Docker 配置文件
$ mkdir -p /etc/systemd/system/docker.service.d

3.3 重启 Docker 服务

$ systemctl daemon-reload && systemctl restart docker && systemctl enable docker

4、kubeadm 安装 k8s

说明:三台虚拟机都需要安装、部署 Docker

# 配置安装 k8s 相关的 yum 源
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
         http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF

# 安装 kubeadm / kubelet / kubectl 并启动 kubelet
$ yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
$ systemctl enable kubelet && systemctl start kubelet

5、k8s 组件镜像

# 上传 kubeadm-basic.images.tar.gz 解压
$ tar -zxvf kubeadm-basic.images.tar.gz

# 将解压的所有 tar 都导入本地镜像
$ docker load -i /root/kubeadm-basic.images/apiserver.tar
$ docker load -i /root/kubeadm-basic.images/coredns.tar
$ docker load -i /root/kubeadm-basic.images/etcd.tar
$ docker load -i /root/kubeadm-basic.images/kubec-con-man.tar
$ docker load -i /root/kubeadm-basic.images/pause.tar
$ docker load -i /root/kubeadm-basic.images/proxy.tar
$ docker load -i /root/kubeadm-basic.images/scheduler.tar

6、k8s部署

说明:该操作只需要在 k8s-master-01 上进行,并且要求 CPU 核心数要大于 1 核。若机器性能不行的话,时间比较长,不要急。

# 获取 yaml 资源配置文件
$ kubeadm config print init-defaults > kubeadm-config.yaml

# 对刚才获取的 yaml 文件进行修改
$ vim kubeadm-config.yaml
#### 修改 kubeadm-config.yaml 中内容
        localAPIEndpoint:
          advertiseAddress: 192.168.146.100 # xxx
        kubernetesVersion: v1.15.1 # xxx
        networking:
          # 指定 flannel 模型通信 pod网段地址,此地址不可修改,只能这么设置
          podSubnet: "10.244.0.0/16"
          serviceSubnet: "10.96.0.0/12"
        ---
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: kubeProxyConfiguration
        featureGates:
          SupportIpVSProxyMode: true
        mode: ipvs


# 初始化主节点,并部署
$ kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

#### 在初始化和部署时注意以下信息,后面需要用到
.........
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

#### 下面三条命令在 master 上执行 否则后面会操作失败
  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:

#### 下面的命令用来在 k8s-node-01 / k8s-node-02 上执行,这样 node 节点就可以加入集群了
kubeadm join 192.168.146.100:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:e20e0b59cfc64fc12e8958793f5fd6402d7b49bd5971f013fbede8d5c4e4633f


### 在初始化和部署中,可以用以下命令来查看 pod 和 node 状态
$ kubectl get pod -n kube-system
$ kebuctl get nodes

### 在这一步成功后,执行命令 注意节点状态,这是由于缺少 flannel
$ kebuctl get nodes
NAME            STATUS   ROLES    AGE   VERSION
k8s-master-01   NotReady    master   14h   v1.15.1

7、flannel 插件安装

说明:该操作只需要在 k8s-master-01 上进行。

# 下载 flannel 插件
# 这里 kube-flannel.yml 建议下载到本地,上传到服务器,网站基本不可用
$ wget https://xxxxxxxxxx/ronwxy/ops/blob/master/k8s/installation/basic/kube-flannel.yml

# 部署 flannel
$ kubectl create -f kube-flannel.yml

8、验证

$ kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
k8s-master-01   Ready    master   14h   v1.15.1
k8s-node-01     Ready    <none>   14h   v1.15.1
k8s-node-02     Ready    <none>   14h   v1.15.1

$ kubectl get pod -n kube-system
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-8pmsj                1/1     Running   1          14h
coredns-5c98db65d4-n2r9m                1/1     Running   1          14h
etcd-k8s-master-01                      1/1     Running   1          14h
kube-apiserver-k8s-master-01            1/1     Running   1          14h
kube-controller-manager-k8s-master-01   1/1     Running   1          14h
kube-flannel-ds-amd64-gt5d4             1/1     Running   1          14h
kube-flannel-ds-amd64-npqmg             1/1     Running   1          14h
kube-flannel-ds-amd64-rpdlp             1/1     Running   1          14h
kube-proxy-45rvm                        1/1     Running   1          14h
kube-proxy-r7jtn                        1/1     Running   1          14h
kube-proxy-rqg84                        1/1     Running   1          14h
kube-scheduler-k8s-master-01            1/1     Running   1          14h

image-20220325153209105.png