1. 1 基础环境准备

1.1.1 硬件准备

机器配置:2核CPU,4G内存,40G系统盘

系统:CentOS7.7

机器数量:3台 (master01 node01 node02)

1.1.2 系统环境配置

修改配置静态hostname

hostnamectl set-hostname master01 --static

修改hosts表,集群所有节点保持文件内容一致

#Kubernetes
172.31.53.87    master01
172.31.53.88    node01
172.31.53.86    node02

配置服务器时间统一
关闭firewalld

systemctl stop firewalld
systemctl disable firewalld

关闭SELinux

getsebool  #查看selinux
 setenforce 0  #临时生效
 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config  #永久生效(需要重启服务器)

关闭swap

 # 临时关闭
 	swapoff -a

 # 永久关闭
 	注释掉/etc/fstab下的swap一行

1.1.3 Docker环境准备

更新yum包索引

yum update

安装软件包以允许yum通过HTTPS使用存储库

yum -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

添加Docker的官方GPG密钥

cd /etc/yum.repos.d/
curl -O  https://download.docker.com/linux/centos/docker-ce.repo

安装docker-ce最新版本

yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
docker info

解决问题:WARNING: No swap limit support(操作系统下docker不支持内存限制的警告),基于RPM的系统上不会发生此警告,该系统默认情况下启用这些功能。解决方法:vim /etc/default/grub 添加或编辑GRUB_CMDLINE_LINUX行以添加这两个键值对"cgroup_enable=memory swapaccount=1",例子:

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"

docker 在 1.13 版本之后,将系统iptables 中 FORWARD 链的默认策略设置为 DROP,并为连接到 docker0 网桥的容器添加了ACCEPT规则,临时解决办法:

iptables -P FORWARD ACCEPT

永久解决办法:

vim /lib/systemd/system/docker.service
# 在[Service]下添加:
	ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload && systemctl restart docker.service

注意:不同的操作系统iptables命令的路径可能不一样。需要随系统更改。

设置daemon.json

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://ezdhou8v.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
systemctl daemon-reload && systemctl restart docker.service

1.1.4 kubeadm环境准备

配置yum源,安装kubeadm、kubelet、kubectl

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

开启这些设置使通过网桥的数据包由主机系统上的iptables规则处理,默认关闭,设置为1则开启

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

1.2 创建单控制平面集群

1.2.1 初始化集群

命令详解
kubeadm config upload from-file:由配置文件上传到集群中生成ConfigMap;
kubeadm config upload from-flags:由配置参数生成ConfigMap;
kubeadm config view:查看当前集群中的配置值;
kubeadm config print init-defaults:输出kubeadm init默认参数文件的内容;
kubeadm config print join-defaults:输出kubeadm join默认参数文件的内容;
kubeadm config migrate:在新旧版本之间进行配置转换;
kubeadm config images list:列出所需的镜像列表;
kubeadm config images pull:拉取镜像到本地;

生成配置文件

kubeadm config print init-defaults >  init-defaults.yaml
vim init-defaults.yaml修改:
	clusterName: Cluster01	
	advertiseAddress: 172.24.51.176
	imageRepository: registry.aliyuncs.com/google_containers

执行初始化操作

kubeadm init --config init-defaults.yaml

或者

kubeadm init --apiserver-advertise-address=172.24.51.176 --image-repository=registry.aliyuncs.com/google_containers
# 执行完初始化保存最后输出的结果到文件:管理用户配置、部署网络、添加节点相关信息.如果在初始化集群的时候出现报错,请执行   kubeadm reset  命令执行重置,解决提示的报错后在执行初始化操作。

1.2.2 kubectl配置文件

root用户

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
source /root/.bashrc

非root用户

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

1.2.3 kubectl参数自动补全

查看completion帮助

kubectl completion -h

kubectl自动补全添加到当前shell

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc 

1.2.4 Kubernetes网络

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

kubectl get pods -n kube-system

如果calico的pod长时间不ready,可以参考:https://blog.csdn.net/u011327801/article/details/100579803
调整calicao 网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-node mesh。我们可以修改成can-reach或者interface的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

// calico.yaml 文件添加以下二行
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens.*"  # ens 根据实际网卡开头配置
 
 // 配置如下             
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens.*"
              #或者 value: "interface=ens160"

1.2.5 Nodes资源管理

1.2.5.1 添加Node节点
# 创建token (Master01节点执行)
kubeadm token create

# 永久token
kubeadm token create --ttl 0

# 查看token (Master01节点执行)
kubeadm token list

# 获取discovery-token-ca-cert-hash值(Master01节点执行)
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

# 添加work节点到kubernetes集群(work node节点执行)
kubeadm join <api-server-ip:port> --token <toke> --discovery-token-ca-cert-hash sha256:<discovery-token-ca-cert-hash>
kubeadm token create --print-join-command 
# 自动生成以下命令,直接加入节点
kubeadm join 172.21.184.81:6443 --token jde7q3.bv4ehxnyxfe04m56     --discovery-token-ca-cert-hash sha256:cde3bc85a4fbc5bdb0e78a532d0fa0fbc301485f7d86806c06ea59f6f9610032 
1.2.5.2 删除Node节点
# 删除节点
kubectl delete nodes <node_name>

# 删除/etc/kubernetes目录
rm -rf /etc/kubernetes/

# ssh到<node_name>执行清理残留操作
kubeadm reset

# 清理Iptables
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

或者

# 清理IPVS
ipvsadm -C

1.3 验证

# 检查组件状态是否正常
kubectl get componentstatuses   

# 查看集群系统信息
kubectl cluster-info

# 查看核心组件是否运行正常(Running)
kubectl -n kube-system get pod

# 每次重启之后,删除非Up状态的容器
docker ps -a | grep -v Up | xargs docker rm -f
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐