K8S教程(2)使用kubeadm方式安装K8S 1.18集群

一、K8S的安装方式介绍

· 二进制部署

用户需要把Master中心节点的所有组件通通安装,同理Node节点也需要安装对应的核心组件,还需要手动配置多组CA证书,过程繁琐,但是对理解K8S的详细运作是最好的。

· kubeadmin部署

K8S官方推出的集群管理工具,在K8S 1.13版本后已经可以在生产环境中使用,但需要注意证书的过期问题。它把原本需要自己部署的组件通过镜像方式拉到本地进行使用。用户只需要安装好kubelet和docker,然后每个Master和Node节点上安装kubeadm即可,通过kubeadm init把第一个节点初始化为Master;通过kubeadm join将其他节点初始化为Node并加入集群。

二、K8S集群所需系统基本环境配置

1、所有节点升级系统内核到4.18及以上

#导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  
#安装elrepo仓库源
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

#查看仓库中可用内核
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安装所需内核
yum --enablerepo="elrepo-kernel" install kernel-lt

#查看当前系统中可用内核,其中第一列的数字就是可用内核编号,如下
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.18.7-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-063ec330caa04d4baae54c6902c62e54) 7 (Core)

#切换默认内核,0代表使用4.18这个内核
grub2-set-default 0

kernel1.jpg 

2、系统环境配置相关 

# 所有节点做好hosts解析
cat /etcc/hosts
192.168.0.101 k8s-master01
192.168.0.102 k8s-master02
192.168.0.103 k8s-master03
192.168.0.200 k8s-master-lb
192.168.0.111 k8s-node01
192.168.0.112 k8s-node02

# 所有节点配置k8s集群中必须的内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF

sysctl --system

# 所有节点关闭防火墙、selinux、swap等
systemctl disable  firewalld && systemctl stop  firewalld 
systemctl disable NetworkManager  && systemctl stop  NetworkManager 
setenforce 0
cat /etc/sysconfig/selinux
SELINUX=disabled
swapoff -a && sysctl -w vm.swappiness=0

# 所有节点配置好时间同步,ntp或chrony都可以,略

# 在每个节点配置阿里云Docker YUM源和加速器,安装Docker并开机自启,否则系统重启后K8S会因为镜像没启动而失败
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
#配置docker镜像加速以及驱动模式
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://6blvkhyf.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdrive-systemd"]
}
EOF

systemctl enable docker && systemctl start docker

# 配置K8S YUM
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

# 所有节点安装ipvsadm
yum install ipvsadm ipset sysstat conntrack libseccomp -y

# 在每个节点安装kubelet、kubeadm、kubectl并启动服务
yum install -y kubelet kubeadm kubectl  #由于官网未开放同步方式, 可能会有gpg检查失败的情况, 这时请用yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
systemctl enable kubelet && systemctl start kubelet

三、kubeadm部署K8S Master

1、拉取K8S所需镜像

由于kubeadm初始化时会从国外地址k8s.gcr.io拉取镜像,如果服务器在国内的话是无法正常拉取的。所以这里需要先通过docker hub手动下载镜像再修改tag名,拉取前可以先配置好docker的镜像加速器。具体用到的仓库名可以去dockerhub去搜索,这里用到的是kubesphere。

#拉取镜像
docker pull kubesphere/kube-apiserver:v1.18.6
docker pull kubesphere/kube-controller-manager:v1.18.6
docker pull kubesphere/kube-scheduler:v1.18.6
docker pull kubesphere/kube-proxy:v1.18.6
docker pull kubesphere/pause:3.2
docker pull azhu/etcd:3.4.3-0
docker pull coredns/coredns:1.6.7

#修改tag
docker tag kubesphere/kube-apiserver:v1.18.6  k8s.gcr.io/kube-apiserver:v1.18.6
docker tag kubesphere/kube-controller-manager:v1.18.6 k8s.gcr.io/kube-controller-manager:v1.18.6
docker tag kubesphere/kube-scheduler:v1.18.6 k8s.gcr.io/kube-scheduler:v1.18.6
docker tag kubesphere/kube-proxy:v1.18.6 k8s.gcr.io/kube-proxy:v1.18.6
docker tag kubesphere/pause:3.2 k8s.gcr.io/pause:3.2
docker tag azhu/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag coredns/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

2、使用kubeadm init命令对集群初始化,可以直接用命令行初始化,也可以用配置文件的形式初始化。初始化时如果指定了国内镜像仓库可以自动去拉取所需镜像,如果这里能拉取成功的话第一步是可以不用做的。初始化过程中可以看到依次做了环境检测、镜像拉取、证书配置等操作。命令运行完成后会生成kubeadmin join命令用于加入集群,一定要记录下来,后续加入集群都是使用那个命令,如果忘了话可以重新生成,后面会讲到。如果集群初始化失败可以运行kubeadm reset进行重置,然后重新初始化。 

#配置文件初始化方式,配置文件需要添加pod网段等信息
kubeadm config print init-defaults > kubeadm-config.yaml
kubeadm init --config=kubeadm-config.yaml

#命令行初始化方式
kubeadm init --pod-network-cidr=192.168.0.0/16 --service-cidr=172.10.0.0/16  --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.18.6
# --service-cidr:指定service网段
# --pod-network-cidr:指定K8S POD网段,不同的网络插件默认网段不一样
# --iamge-repository:指定国内镜像仓库地址
# --kuberntes-version 1.18.6:指定需要的版本
# --ignore-preflight-errors:忽略因为系统配置SWAP而产生的错误

#重置初始化状态
#kubeadm reset 

3、复制配置文件到用户HOME目录 

# 非root用户执行下面命令复制配置文件
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# root用户可以直接用下面的命令
export KUBECONFIG=/etc/kubernetes/admin.conf

4、验证K8S集群服务状态,看到是NotReady状态,这是因为还没有配置CNI容器网络接口(Container Network Interface),CNI标准要求节点与节点网络互通、节点与容器之间网络互通、容器与容器之间网络互通。 

kubectl get nodes

5、K8S支持多种CNI,而从1.18开始推荐使用calico而不再是flannel(如果还需要flannel的话通过https://github.com/coreos/flannel页面下方的Deploying flannel manually可以找到一键部署的命令)。calico网页上提供了安装方式(https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises)运行完成后等一会儿,然后运行docker images命令可以看到CNI的镜像 

#cacico安装方法
wget https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f calico.yaml 

#flannel安装方法
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

6、查看kube-system这个名称空间下的pods信息,K8S组件默认都在该名称空间下。验证flannel镜像是否拉取成功以及node状态是否正常,都没问题的话Master节点就安装完成了 

kubectl get ns  #查看所有namespace
kubectl get pods -n kube-system  #查看指定namespace下的pods
kubectl get node  #查看状态是否为Ready

四、kubeadm部署K8S Node

1、使用kubeadm join命令将新节点加入集群,如果命令提示no route to host请查看Master的iptables规则是否清空

kubeadm join 192.168.145.185:6443 --token 3g743d.h9t34niq0k3n73sx --discovery-token-ca-cert-hash sha256:ac13fc140298b3665e0436d353d94fed494e36b52485df532b4bb719bd6d2e11 --ignore-preflight-errors=Swap  #这里的IP就是第一个主节点IP

2、由于kubeadm生成的token是有过期时间的,可以通过以下方式重新创建node节点和master节点的token 

#重新生成node节点token
kubectl get secret -n kube-system  #查看当前环境中的token和有效时间
kubectl get secret -n kube-system bootstrap-token0-5wfwud -o yaml  #查看bootstrap token信息,其中expiration就是过期时间,用base64命令解密可以看到准确时间
echo "expiration里的字符串" | base64 --decode  #查看过期时间
kubectl delete secret -n kube-system bootstrap-token0-5wfwud  #删除过期token
kubeadm token create --print-join-command  #生成新的node节点密钥

#重新生成master节点token
kubeadm init phase upload-certs --upload-certs

3、在主节点使用kubectl get nodes验证状态为Ready,如果提示Not Ready的话需要等node节点的镜像都拉取完毕。显示角色为<none>代表它可以成为其他角色。至此Node节点配置完毕 

kubectl get pod -n kube-system -o wide  #在master执行此命令查看详情

 

 

五、测试K8S集群

在K8S中创建一个pod,然后验证是否正常运行

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

六、为K8S新加Master节点

1、要新加Master节点需要使用kubeadm init命令上传第一个Master节点的CA证书(这些文件保存在/etc/kubernetes/pki中),命令执行后可以看到证书信息上传到kube-system这个namespace中的提示

kubeadm init phase upload-certs --upload-certs

 2、上面命令除了上传证书到namespace中,还会生成一串key。这个key两小时后会失效,失效后可以重新生成。找到集群初始化后的kubeadm join命令,使用--certificate-key选项加上这串key

kubeadm join 192.168.111.120:6443 --token 1wr731.odgs0fl0v31k7x54  --control-plane   --discovery-token-ca-cert-hash sha256:2b2e660aa718de3ae492013faea779ecb220d0bf0f703cc03d3268b750e1be97  --certificate-keyc0b2c238f87c7c7safi579012567ce147

3、验证节点 

kubectl get nodes

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值