Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
系统约定
k8s-master 192.168.90.220 Centos7 k8s-node1 192.168.90.221 Centos7 k8s-node2 192.168.90.222 Centos7
我们使用kubeadm搭建k8s集群,为了支持master与node之前的通信,我们还需要在master上安装flannel来实现maste与node之间的网络通信
我们先做环境的配置,来满足K8s安装的要求,以下操作在所有机器上需要做
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0
关闭swap交换分区
swapoff -a #临时关闭
永久关闭需要注释掉/etc/fstab文件中的swap行
安装一些必要的工具和依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
设置主机名,在每个节点设置对应的主机名
192.168.90.220机器设置以下主机名
hostnamectl set-hostname k8s-master
192.168.90.221机器设置以下主机名
hostnamectl set-hostname k8s-node1
192.168.90.222机器设置以下主机名
hostnamectl set-hostname k8s-node2
编辑节点hosts文件,将所有节点的ip和主机名一一对应,所有节点hosts文件均需要修改
192.168.90.220 k8s-master 192.168.90.221 k8s-node1 192.168.90.222 k8s-node2
将桥接的IPv4流量传递到iptables的链,在每个节点添加如下的命令
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 fs.may_detach_mounts = 1 vm.swappiness = 0 EOF
开启IP转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward
加载br_netfilter模块
modprobe br_netfilter
查看是否加载
lsmod | grep br_netfilter
使配置生效
sysctl --system
同步所有节点时间,也可以自行配置时钟源服务器,作为集群内时间服务器
yum install ntpdate -y ntpdate time.windows.com
开启ipvs
yum -y install ipset ipvsadm
在所有节点执行以下命令
cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF
授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules
检查加载是否成功
lsmod | grep -e ipvs -e nf_conntrack_ipv4
所有节点安装docker、kubeadm、kubelet
安装docker,首先安装源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
列出所有版本
yum list docker-ce --showduplicates | sort -r
安装并固定版本
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15
设置docker开机启动并启动服务
systemctl enable docker systemctl start docker docker --version #查看docker版本
设置Docker镜像加速器,添加daemon.json配置文件
mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], "log-driver": "json-file", "log-opts":{ "max-size":"10m","max-file":"1"}, "storage-driver": "overlay2", "insecure-registries": ["192.168.1.78:5000"] } EOF
重载,并重启服务
systemctl daemon-reload systemctl restart docker
安装kubeadm、kubelet和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=0 EOF
然后进行k8s相关组件的安装
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:
vi /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
在k8s-master操作,首先生成default.yaml部署配置文件
cd /etc/kubernetes kubeadm config print init-defaults > default.yaml
然后修改配置文件
sed -i "s/1.2.3.4/0.0.0.0/" /etc/kubernetes/default.yaml #修改集群能被所有ip访问 sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#" /etc/kubernetes/default.yaml #修改成国内源 sed -i '/10.96.0.0\/12/a\ podSubnet: 10.244.0.0\/16' /etc/kubernetes/default.yaml #增加POD网段 sed -i "s/name: node/name: $HOSTNAME/g" /etc/kubernetes/default.yaml #配置文件默认节点不是主机名,替换成主机名
然后初始化集群,注意此处记录下生成的token密钥
kubeadm init --config=default.yaml
初始化如果报错,可以尝试使用下面的方法修复
The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
解决方法:
修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件解决,如果目录不存在需要创建这层目录
vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/default/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
保存退出,然后重启下服务
systemctl daemon-reload systemctl restart kubelet
根据提示信息,在k8s-master节点上使用kubectl工具,配置常规用户如何使用kubectl访问集群
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
添加k8s的Node节点,分别在两个k8s-node节点执行,token密钥在k8s-master初始化时生成的
kubeadm join =192.168.90.220:6443 --token mrmhs6.bxlyxuaz5ug68x4z \ --discovery-token-ca-cert-hash sha256:efe69c7e82331ff97543e9fbeff929bc23c378e899dcff2e8a2d70e8990c8687
安装完成以后可以看到节点都添加进来了
kubectl get node
在k8s-master节点部署CNI网络插件Flannel,如果安装失败,我们可以下载这个yml文件到本地然后再试
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看是否安装成功
kubectl get pod -n kube-system
在k8s-master节点使用kubectl工具查看节点状态
kubectl get nodes
查看集群健康状态
kubectl get cs kubectl cluster-info
报如下错误
NAME STATUS MESSAGE ERROR controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused etcd-0 Healthy {"health":"true"}
有点问题,可以按以下方式解决
vi /etc/kubernetes/manifests/kube-scheduler.yaml vi /etc/kubernetes/manifests/kube-controller-manager.yaml #将以上两个文件中的- --port=0 注释掉即可 - --port=0
修改完,再次使用查看集群状态
kubectl get node
kubectl cluster-info
到此K8S集群环境就部署成功了,本次基本重新整理了下,所有集群软件安装整理的匹配版本v1.18.20,部署中遇到的问题已收集在相应的地方提供了解决方法。