这里使用使用的环境是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
-
–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节点异常,不影响用户请求。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏