Centos8环境部署kubernetes

avatar 2022年10月16日18:16:55 评论 360 次浏览

这里使用使用的环境是Centos8,部署kubernetes,Centos7环境和Centos8环境不同之处主要集中在安装docker方面,其他都一样,Centos7部署docker使用的是yum,而Centos8使用的是dnf,下面看看一下Centos8环境部署的方法:

安装前准备工作

关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久,setenforce 0 #临时。
关闭swap:swapoff -a #临时,vim /etc/fstab #永久–> sed -ri 's/.swap./#&/' /etc/fstab。
将桥接的IPv4流量传递到iptables的链(要在每个机器上执行)
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system #生效
时间同步:ntpdate time.windows.com。

docker安装

因为每一台都是给予docker环境部署,所以需要每个节点都部署一下docker,这里需要注意的是,如果在生产环境中安装docker的话一定要安装制定版本,避免后期如果需要增加节点时,还不指定版本出错的问题。

dnf install -y yum-utils device-mapper-persistent-data lvm2
//官方源地址(比较慢)
~]# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
//阿里云
~]# dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//清华大学源 
~]# dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.reposd
安装docker
dnf install docker-ce -y
启动docker
systemctl start docker
systemctl enable  docker        // 设置开机自启
#改变docker仓库
 cat > /etc/docker/daemon.json << EOF 
{
    "registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"],
    "exec-opts":["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker

安装kubernetes

在master节点部署kubernetes需要的插件kubelet kubeadm 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 --nogpgcheck kubelet kubeadm kubectl
$ yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
#可以使用下面的命令查看仓库中软件的版本
$ yum --showduplicates list kubectl #如果已经安装可以使用kubectl version查看版本
$ systemctl start kubelet
$ systemctl enable kubelet

master节点

在master节点初始化后会出现coredns状态Pending的问题,这里可以使用describe查看一下原因,一般这个原因主要是因为网络插件没有安装好,可以单独安装一下网络插件,不管是安装calico还是安装flannel下面都有方式,我这里使用的是calico。

kubeadm init \
    --apiserver-advertise-address=10.211.55.11 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.23.0 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16
........................................................................................
    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
    
    Alternatively, if you are the root user, you can run:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
    
    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 10.211.55.11:6443 --token wc5ntv.wwrsfggdp4mfs9y1 \
    	--discovery-token-ca-cert-hash sha256:4fab41aec22ce5ead7d493445a7226077ce9f56ce8164fafdecf08e3aa09ea8a
  • –apiserver-advertise-address:API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。指明用 Master 的哪个网络 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定。

  • –image-repository:容器镜像仓库。由于默认拉取镜像地址是k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

  • –pod-network-cidr:指明 pod 网络可以使用的 IP 地址段。Kubernetes 支持多种网络方案,而且不同网络方案对

  • --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。

  • –kubernetes-version:默认值:“stable-1”。为控制平面选择一个特定的 Kubernetes 版本。这里关闭了版本探测,因为它的默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们通过指定版本来跳过网络请求。

  • –service-cidr:默认值:“10.96.0.0/12”。为服务的虚拟 IP 地址指定 IP 地址段。

安装成功后kubeadm join是把node节点加入集群的方式,直接在node节点执行即可,这个token生效时间是24小时,如果超过24小时,可以使用kubeadm token create --print-join-command,重新获取即可。

[root@Mater ~]# mkdir -p $HOME/.kube
[root@Mater ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@Mater ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@Mater ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS     RESTARTS   AGE
kube-system   coredns-6d8c4cb4d-5qvgx                    0/1     Pending    0          4h1m
kube-system   coredns-6d8c4cb4d-lrt9r                    0/1     Pending    0          4h1m
kube-system   etcd-mater                                 1/1     Running    0          4h1m
kube-system   kube-apiserver-mater                       1/1     Running    0          4h1m
kube-system   kube-controller-manager-mater              1/1     Running    0          4h1m
kube-system   kube-proxy-h697w                           1/1     Running    0          3h58m
kube-system   kube-proxy-j8snx                           1/1     Running    0          4h1m
kube-system   kube-scheduler-mater                       1/1     Running    0          4h1m
[root@Mater ~]# kubectl get node
NAME    STATUS     ROLES                  AGE     VERSION
mater   NotReady   control-plane,master   4h2m    v1.23.0
node1   NotReady   <none>                 3h58m   v1.23.0
[root@Mater ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
#k8s-v1.20支持的最新版calico是v3.20
#故正确获取calico的yaml文件应该用:
#https://docs.projectcalico.org/archive/v3.20/manifests/calico.yaml
[root@Mater ~]# kubectl apply -f calico.yaml
#或者使用flannel
[root@Mater ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@Mater ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-66966888c4-5q9j8   1/1     Running   0          4m40s
kube-system   calico-node-4dwbc                          0/1     Running   0          2m20s
kube-system   calico-node-ccvnk                          1/1     Running   0          4m40s
kube-system   calico-node-fqldd                          1/1     Running   0          4m40s
kube-system   coredns-6d8c4cb4d-5qvgx                    1/1     Running   0          4h8m
kube-system   coredns-6d8c4cb4d-lrt9r                    1/1     Running   0          4h8m
kube-system   etcd-mater                                 1/1     Running   0          4h8m
kube-system   kube-apiserver-mater                       1/1     Running   0          4h8m
kube-system   kube-controller-manager-mater              1/1     Running   0          4h8m
kube-system   kube-proxy-fwxsh                           1/1     Running   0          2m20s
kube-system   kube-proxy-h697w                           1/1     Running   0          4h5m
kube-system   kube-proxy-j8snx                           1/1     Running   0          4h8m
kube-system   kube-scheduler-mater                       1/1     Running   0          4h8m
[root@Mater ~]# kubectl get node
NAME    STATUS   ROLES                  AGE     VERSION
mater   Ready    control-plane,master   4h11m   v1.23.0
node1   Ready    <none>                 4h8m    v1.23.0
node2   Ready    <none>                 5m18s   v1.23.0

这里才表示kubernetes安装成功了,下面针对安装过程中遇到的问题,说明一下,这个问题的主要原因是没有关闭swap,根据提示应该可以看出来,上面我使用的修改配置文件,修改配置文件必须要重启,所以我没有重启,才造成的这个问题。可以参考上面的临时关闭方法。

[preflight] Running pre-flight checks
	[WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
	[WARNING FileExisting-tc]: tc not found in system path
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

测试

kubernetes已经部署好了,下面简单部署一个nginx看一下,是否可以使用,因为我这里使用的是虚拟机,所以没有负载均衡,如果有条件的话建议通过负载均衡的方式或者阿里云的slb,把node节点加入到负载均衡中,这样就能保证一个node节点异常的情况下服务不可用的问题。

[root@Mater ~]# kubectl create deployment nginx --image=nginx
[root@Mater ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
default       nginx-85b98978db-hx6ph                     1/1     Running   0          62s
[root@Mater ~]# kubectl expose deployment nginx --port=80 --type=NodePort #使用IP+端口的方式访问
service/nginx exposed
[root@Mater ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-hx6ph   1/1     Running   0          111s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5h6m
service/nginx        NodePort    10.106.38.25   <none>        80:32478/TCP   7s

因为我这里没有负载均衡,所以使用的是NodePort的方式进行访问,NodePort访问是可以通过所有的宿主机的IP加上固定端口请求的,看下面的示例。

这是我部署好后三个节点皆可访问,如果任何一个节点出现异常,使用ip+端口方式直接访问是不可取的,因为ip都不通了也就无法访问了,所以这个时候就需要在集群外部署一个proxy集群,proxy集群的主要作用是避免node节点异常,不影响用户请求。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: