环境:

K8S版本:v1.19.3

名称系统IP主机名
MasterCentOS 7.8.2003 x86_64172.16.135.10k8s-master01
Node01CentOS 7.8.2003 x86_64172.16.135.11k8s-node01
Node02CentOS 7.8.2003 x86_64172.16.135.12k8s-node02
Node03CentOS 7.8.2003 x86_64172.16.135.13k8s-node03

备注:此集群仅用于测试使用,不可用户生产环境。生产环境需要考虑Master节点的高可用,且需要做适当的优化,后面可能会写一篇文章单独说

环境配置

时间同步

K8S集群应保持时间同步,避免出现奇怪的问题。

# 在所有节点上执行
yum install chrony
systemctl start chronyd
systemctl enable chronyd

关闭swap

k8s默认不允许主机开启swap,这里将其关闭。如果需要启用swap忽略错误,需要在kubelet启动参数上添加--ignore-preflight-errors=Swap。或者修改/etc/sysconfig/kubeletKUBELET_EXTRA_ARGS="--fail-swap-on=false"

关闭swap

# 在所有节点上执行
# 修改 /etc/fstab,注释swap一行
# 然后执行swapoff命令立即关闭swap
swapoff -a

防火墙配置

我习惯于使用iptables作为防火墙配置工具,因此禁用默认的firewalld,启用iptables,且将默认规则做了一些删减,以免出现网络不通的情况,需要根据自身情况配置

# 在所有节点上执行
systemctl stop firewalld
systemctl disable firewalld
yum install -y iptables-services

cat > /etc/sysconfig/iptables << EOF
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT
EOF

systemctl start iptables
systemctl enable iptables

安装docker

# 在所有节点上执行
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker

安装kubelet、kubeadm、kubectl

# 在所有节点上执行
cat > /etc/yum.repos.d/kubernetes.repo << "EOF"
[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-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
systemctl enable kubelet
systemctl start kubelet

下载k8s所需镜像

官方镜像站点是k8s.gcr.io,由于网络问题,k8s.gcr.io访问不了,因此我们需要从其它镜像仓库上下载k8s镜像,这里从阿里云上下载

# 在master上执行,如果你安装的不是1.19.3版本,则需要修改version的值
cat > images.sh << "EOF"
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.19.3
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done
EOF

sh images.sh
# 在node上执行,如果你安装的不是1.19.3版本,则需要改version的值
# 因为node仅需要kube-proxy pause coredns这三个镜像,因此和master下载的镜像不一样,你也可以用master那个images.sh下载全部镜像
cat > images.sh << "EOF"
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.19.3
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  i=$(echo $imagename|awk -F: '{print $1}')
  case $i in
    kube-proxy|pause|coredns)
      docker pull $url/$imagename
      docker tag $url/$imagename k8s.gcr.io/$imagename
      docker rmi -f $url/$imagename
      ;;
  esac
done
EOF

sh images.sh

初始化集群

# 如果你安装的不是1.19.3版本,则需要修改--kubernetes-version的值
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm init --kubernetes-version=v1.19.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

初始化成功会输出以下内容:

Your Kubernetes control-plane has initialized successfully!

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

  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:

kubeadm join 172.16.135.10:6443 --token foqdxx.4495z6spg7tohq5d \
    --discovery-token-ca-cert-hash sha256:14e6fad9c4aa1143083783d8cf84eefe067976c14c5628a8fd38199208689e0f

我们要按照他的指示操作

# 在master上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 在所有node上执行
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm join 172.16.135.10:6443 --token foqdxx.4495z6spg7tohq5d \
    --discovery-token-ca-cert-hash sha256:14e6fad9c4aa1143083783d8cf84eefe067976c14c5628a8fd38199208689e0f

这个token会过期,如果后续要将主机加入集群,执行以下命令获取新的token

kubeadm token create --print-join-command

安装flannel网络插件

# 在master上执行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

网络插件会从quay.io上下载镜像,网速会比较慢,而且不稳定,这个步骤可能会卡住很久。我们可以手动将镜像pull到本地

# 在所有节点上执行
docker pull quay.io/coreos/flannel:v0.13.0
# flunnel的版本可能会更新,可以使用命令查看当前所需版本,在master上执行
kubectl describe ds kube-flannel -n kube-system | grep Image

查看集群状态:

kubectl get node

当主机状态为Ready则表示集群状态正常

[[email protected] ~]# kubectl get node
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   72m   v1.19.3
k8s-node01     Ready    <none>   70m   v1.19.3
k8s-node02     Ready    <none>   70m   v1.19.3
k8s-node03     Ready    <none>   70m   v1.19.3

配置kubectl命令自动补全

在日常的管理中,会经常使用到kubectl命令,配好命令补全可以大大提高命令的输入速度

# 在master上执行
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

这样就可以按tab键补全命令啦!

标签: none

添加新评论