说明:部分操作请先看报错说明,在进行操作!!


环境准备(1. centos7.7操作系统配置)

#-------------------------------------------------------------------------------------------------------------------------
# (1)修改在主机名
hostnamectl set-hostname <hostname>
# (不确定要不要重启,看效果是立即生效的)reboot重启系统,重新连接shell,使用这种方式修改,可以永久性的修改主机名称!
# 主机名成功修改后,/etc/hostname文件内容更新为最新主机名,但是/etc/hosts文件中主机名不变,需要手工修改
vim /etc/hosts
192.168.182.134  zkc-master
192.168.182.135  zkc-slave-1
192.168.182.130  zkc-slave-2
192.168.182.133  zkc-slave-3
# 或者
cat <<EOF >>/etc/hosts
192.168.182.134  zkc-master
192.168.182.135  zkc-slave-1
192.168.182.130  zkc-slave-2
192.168.182.133  zkc-slave-3
EOF# 立即生效
sysctl --system
#-------------------------------------------------------------------------------------------------------------------------
#  接下来正式进行docker安装操作,三台机器同时操作,不要只执行一个节点机器
# (2)给关闭防火墙
systemctl stop firewalld    # 关闭防火墙(临时关闭)
systemctl disable firewalld # 关闭防火墙(永久关闭)
#-------------------------------------------------------------------------------------------------------------------------
# (3)关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#-------------------------------------------------------------------------------------------------------------------------
# (4)关闭 swap
# 方式一
swapoff -a # 临时
vim /etc/fstab # 永久(这个执行后不会生效) free -m 看swap都为0 是生效的注释掉最后一行(有 swap 单词 实列 #UUID=a7a5896b-8706-4837-a767-aa0a79b81278 swap                    swap    defaults        0 0)
sysctl -p
# 方式二
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p
# 方式三(推荐)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久
#-------------------------------------------------------------------------------------------------------------------------
# (5)将桥接的IPv4流量传递到 iptables 的链# 设置开机时能够自动加载模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF# 加载内核所需模块
modprobe overlay
modprobe br_netfilter# 设置所需的 sysctl 参数,参数在重新启动后保持不变(方式一)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward  = 1
vm.swappiness = 0 # 禁止使用swap空间,只有当系统OOM时才允许使用它
EOF
# 设置所需的 sysctl 参数,参数在重新启动后保持不变(方式二)
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0 # 禁止使用swap空间,只有当系统OOM时才允许使用它# 应用 sysctl 参数而不重新启动
sysctl --system # 生效
#-------------------------------------------------------------------------------------------------------------------------
# (6)安装依赖环境
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstatlibseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip bind-utils gcc
#-------------------------------------------------------------------------------------------------------------------------
# (7)开启IPVS
# 安装IPVS(6中有就不用在安装了)
yum -y install ipset ipvsdm# 编译ipvs.modules文件
# 方式一
vi /etc/sysconfig/modules/ipvs.modules
# 文件内容如下
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 方式二
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 ip_vs -e nf_conntrack_ipv4
# 重启电脑
reboot
# 检查是否生效
lsmod | grep ip_vs_rr
或者
lsmod | grep -e ipvs -e nf_conntrack_ipv4
#-------------------------------------------------------------------------------------------------------------------------
# (7)时间同步
yum install ntpdate -y
ntpdate time.windows.com
#-------------------------------------------------------------------------------------------------------------------------
# (8)安装docker
# (9)修改docker源
# (10)修改yum源 epel源
#-------------------------------------------------------------------------------------------------------------------------
# (11)设置主机之间ssh连接不要密码
# 在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)
ssh-keygen -t rsa# 在三台(slave)服务器分别执行下面命令,密码输入系统密码,将公钥拷到master服务器上(如若在本机上执行ssh-copy-id 8.140.25.1 就是将自己的公钥拷贝给自己,在执行下面操作的时候,就可以实现 (原本本机不执行ssh-copy-id 8.140.25.1,本机访问别的主机不要密码,其他主机访问本机要),相互访问不要密码)
ssh-copy-id 192.168.182.134# 之后可以在master服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥(没在masterr执行 ssh-copy-id 192.168.182.134 的情况下是3个)
cat /root/.ssh/authorized_keys# 执行下面命令,将master的公钥添加到authorized_keys文件中(此时应该包含4个公钥)(在masterr执行了 ssh-copy-id 192.168.182.134,这里就不用了)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys# 从master服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。
scp /root/.ssh/authorized_keys root@192.168.182.135:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@192.168.182.130:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@192.168.182.133:/root/.ssh/authorized_keys# 检测
ssh 192.168.182.135
ssh 192.168.182.130
ssh 192.168.182.133
ssh 192.168.182.134#-------------------------------------------------------------------------------------------------------------------------
# (12)修改docker驱动,cgroup驱动程序改为systemd驱动
# 如果master不该slave改了,在执行kubeadm join 时无法添加节点(连接拒绝)
# slave没改的话在执行kubeadm join 会出现警告(具体不改能不能行,不太确定,出现警告我就直接解决问题了)
# 修改前先查看驱动信息
docker info | grep Cgrou
# 修改/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
#添加以下信息
{"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 查看驱动信息
docker info | grep Cgrou
#-------------------------------------------------------------------------------------------------------------------------
# (13)k8s加速(这里是阿里云的,但是去阿里云复制的无法使用,这个是百度出来的)
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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum clean all
yum -y makecache
#-------------------------------------------------------------------------------------------------------------------------
# (14)安装指定版本的 kubeadm,kubelet 和 kubectl,为了下面拉取对应版本镜像做准备
#  可以用下面的命令查看可以安装的版本
yum list kubeadm --showduplicates | sort -r
# 可以先查看当前k8s最新版本号
yum list --showduplicates kubeadm --disableexcludes=kubernetes# 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes
# 或者  --disableexcludes=kubernetes 防止包冲突
yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0# 设置kubelet(还没设置过)
如果不配置kubelet,可能会导致K8S集群无法启动。为实现docker使用的cgroupdriver与kubelet
使用的cgroup的一致性。
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"# 开机启动
systemctl enable kubelet
# 或者
systemctl enable kubelet && systemctl start kubelet#-------------------------------------------------------------------------------------------------------------------------
# (15)kubectl命令自动补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source ~/.bash_profile

环境准备(2. k8s集群镜像下载)

这里在执行 kubeadm init 时制定了仓库这一步就不用准备了

如果没有指定仓库需要准备的,因为无法下载国外的镜像(具体没有试过,没有指定仓库的,但是肯定要准备镜像的)

# 查看安装集群需要的镜像
kubeadm config images list# (这里我用的是这个,我在下面面执行的命令中制定了仓库)
# 在 kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16 中指定镜像仓库后从阿里云下载的镜像(不指定镜像需要自己下载,看下面)
registry.aliyuncs.com/google_containers/kube-proxy:v1.20.1
registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.1
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.1
registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns:1.7.0
registry.aliyuncs.com/google_containers/pause:3.2# 在 kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16 不指定仓库需要自己下载镜像
# 国内环境无法下载
docker pull k8s.gcr.io/kube-apiserver:v1.20.1
docker pull k8s.gcr.io/kube-controller-manager:v1.20.1
docker pull k8s.gcr.io/kube-scheduler:v1.20.1
docker pull k8s.gcr.io/kube-proxy:v1.20.1
docker pull k8s.gcr.io/pause:3.2
docker pull k8s.gcr.io/etcd:3.4.13-0
docker pull k8s.gcr.io/coredns:1.7.0
# 国内镜像
docker pull rekca/kube-apiserver:v1.20.1
docker pull rekca/kube-controller-manager:v1.20.1
docker pull rekca/kube-scheduler:v1.20.1
docker pull rekca/kube-proxy:v1.20.1
docker pull rekca/pause:3.2
docker pull rekca/etcd:3.4.13-0
docker pull rekca/coredns:1.7.0
# tag(修改名字)
docker tag rekca/kube-apiserver:v1.20.1 k8s.gcr.io/kube-apiserver:v1.20.1
docker tag rekca/kube-controller-manager:v1.20.1 k8s.gcr.io/kube-controller-manager:v1.20.1
docker tag rekca/kube-scheduler:v1.20.1 k8s.gcr.io/kube-scheduler:v1.20.1
docker tag rekca/kube-proxy:v1.20.1 k8s.gcr.io/kube-proxy:v1.20.1
docker tag rekca/pause:3.2 k8s.gcr.io/pause:3.2
docker tag rekca/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag rekca/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0https://hub.docker.com/u/mirrorgooglecontainers

主机准备

ip 主机名
192.168.182.134 master
192.168.182.135 slave-1
192.168.182.130 slave-2
192.168.182.133 slave-3

部署Kubernetes Master

# 1、初始化(只在master执行)
kubeadm init \
--apiserver-advertise-address=192.168.182.134 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.81.0.0/16# 如果执行这个(如果用网络插件 flannel 就需要 将 --pod-network-cidr的ip 等于 kube-flannel.yml中Network的ip,意思就是要改kube-flannel.yml中的Network的ip)
# 如果用 calico 要将calico.yaml中192.168.0.0/16(这里的ip为calico.yaml3.14中的默认ip) 改为 --pod-network-cidr 一样的值
kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16# 如果执行这个(使用网络插件 flannel 这条命令的--pod-network-cidr的ip 就等于 kube-flannel.yml中的Network的ip)
kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16# 没有执行仓库
kubeadm init --apiserver-advertise-address=192.168.182.134 --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16# 参数说明:
apiserver-advertise-address:节点绑定的服务器ip(多网卡可以用这个参数指定ip)
image-repository:指定镜像仓库 # 由于从阿里云拉镜像,解决了k8s.gcr.io镜像拉不下来的问题
kubernetes-version:要安装的版本
--service-cidr:为service的虚拟 IP 地址另外指定 IP 地址段
pod-network-cidr:负载容器的子网网段

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 看节点
kubectl get nodes# 报错
输入 :cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
输出 :cp: overwrite ‘/root/.kube/config’?
# 后面输入y 就行 cp: overwrite ‘/root/.kube/config’? y# 报错 (master 主机中的docker没有修改驱动的情况下)
# Docker的cgroup驱动程序,推荐使用systemd驱动
如果在准备环境的时候没有修改驱动,那么在下面的 “部署Kubernetes node” 中执行 kubeadm join.....略  时会失败
# 报错如下
[kubelet-check] 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.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] 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.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] 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.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] 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.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] 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.
error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition
To see the stack trace of this error execute with --v=5 or higher
# 这时需要
# 修改前先查看驱动信息
docker info | grep Cgrou
# 修改/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
#添加以下信息
{"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 查看驱动信息
docker info | grep Cgrou# 重新初始化
kubeadm reset # 先重置# 重新执行第一步
kubeadm init \
--apiserver-advertise-address=192.168.182.134 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.81.0.0/16

部署Kubernetes node

# 向集群中添加新的节点
# 这个要复制上图提示的(不要用这里的)
#在 192.168.182.135、192.168.182.130、192.168.182.133 中执行(slave-1、slave-2、slave-3)
kubeadm join 192.168.182.134:6443 --token p3e2o2.umqv1zsbxu7uyruc \--discovery-token-ca-cert-hash sha256:290da2c61082ab5566de2b598818a8b6f45939c6a82be95b0113162b6656cfb4# 看节点
kubectl get nodes# 默认token有效期为24小时,当过期之后,改token就不可用了,这时就需要重新创建token
kubeadm token create --print-join-command# 报错
# error execution phase preflight: couldn't validate the identity of the API Server: Get "https://192.168.182.134:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": dial tcp 192.168.182.134:6443: connect: no route to host                                                                                                                        To see the stack trace of this error execute with --v=5 or higher
# 1解决方法
# master主机上重新生成token
[root@zkc-master ~]# kubeadm token generate                                                              #生成toke
ey7p23.852cnnyd47tx2pt3                                                                                  #下面这条命令中会用到该结果
[root@zkc-master ~]# kubeadm token create ey7p23.852cnnyd47tx2pt3 --print-join-command --ttl=0           #根据token输出添加命令
kubeadm join 192.168.182.134:6443 --token anelsh.v91a6sc5fshzok0e     --discovery-token-ca-cert-hash sha256:3a90063656a1106d2c5e0f3cfa91eabeaa1d1465ab283d888aef4da1057757cc# 2 解决方法
# k8s api server不可达
# 此时需要检查和关闭所有服务器的firewalld和selinux
[root@master ~]#setenforce 0
[root@master ~]#sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@master ~]# systemctl disable firewalld --now# 3 解决方法
# 上面方法试了没用,关闭防火墙后重启服务器后可以了# 报错
# error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition                                       To see the stack trace of this error execute with --v=5 or higher
# 解决
swapoff -a
kubeadm reset
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X# 报错
# error execution phase preflight: [preflight] Some fatal errors occurred:                                                                   [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists                                           [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists                                             [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
# 解决
# 重新初始化
kubeadm reset # 先重置# 警告
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
# 解决方法
# (6)(slave执行就行,可以先不执行报错了在执行)
# 使用systemd驱动(不修改在下面操作过程中会报错(警告) 检测到"cgroupfs"作为Docker的cgroup驱动程序,推荐使用systemd驱动。)
# 修改前先查看驱动信息
docker info | grep Cgrou
# 修改/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
#添加以下信息
{"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 查看驱动信息
docker info | grep Cgrou

部署CNI网络插件(calico、flannel二选一)

cni是容器网络接口,作用是实现容器跨主机网络通信
pod的ip地址段,也称为cidr在master节点上运行
以最常用的calico和flannel插件为例kubectl命令自动补全

安装flannel网络插件(master上安装)

注意:

[root@zkc-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-9696z 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-d6tk9 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-l9p4p 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-trdd9 0/1 CrashLoopBackOff 1 13s
kube-system coredns-7f89b7bc75-gp9ff 0/1 ContainerCreating 0 10h
kube-system coredns-7f89b7bc75-lqpsm 0/1 ContainerCreating 0 10h

此报错是因为安装Kubeadm Init的时候,没有增加 --pod-network-cidr 10.244.0.0/16参数或者kube-flannel.yml如果yml中的"Network": "10.244.0.0/16"--pod-network-cidr不一样,所以,修改yml文件中的Network为相同网段后即可

用下面这天就不用改

kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

# kube-flannel.yml文件在国外服务器上,搭建k8s集群时可以使用如下kube-flannel.yml。kube-flannel的命名空间是在 kube-system下。# 下载连接(可能下载不了)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# gitee 上的库
https://gitee.com/mirrors/flannel# 修改kube-flannel.yml中的镜像仓库地址为国内源
sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml# 如果kube-flannel.yml中的`"Network": "10.244.0.0/16"`和`--pod-network-cidr`不一样就需要修改kube-flannel.yml# 安装网络插件
kubectl apply -f kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 执行查看安装的状态
kubectl get pods --all-namespaces# 查看日志
kubectl -n kube-flannel logs kube-flannel-ds-9696z
# 查看pod日志
kubectl get pod -n kube-flannel kube-flannel-ds-9696z# 获取【kube-system命名空间】下的pod列表(查看flannel部署进度)
kubectl get pod -n kube-system -owide
# 获取【kube-system命名空间】下的pod列表(查看flannel部署进度)
kubectl get pods -n kube-system
# 获取【kube-flannel命名空间】下的pod列表(查看flannel部署进度)
kubectl get pods -n kube-flannel
# 获取【所有命名空间】下的pod列表(查看flannel部署进度)(建议使用这个吧)
kubectl get pods --all-namespaces# 结果
NAMESPACE      NAME                                 READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-6d8wn                1/1     Running   0          24m
kube-flannel   kube-flannel-ds-bzgll                1/1     Running   0          24m
kube-flannel   kube-flannel-ds-fsb9m                1/1     Running   0          24m
kube-flannel   kube-flannel-ds-wdczg                1/1     Running   0          24m
kube-system    coredns-7f89b7bc75-gp9ff             1/1     Running   0          11h
kube-system    coredns-7f89b7bc75-lqpsm             1/1     Running   0          11h
kube-system    etcd-zkc-master                      1/1     Running   0          11h
kube-system    kube-apiserver-zkc-master            1/1     Running   0          11h
kube-system    kube-controller-manager-zkc-master   1/1     Running   0          11h
kube-system    kube-proxy-5p6vd                     1/1     Running   0          11h
kube-system    kube-proxy-bmt6k                     1/1     Running   0          11h
kube-system    kube-proxy-bvr48                     1/1     Running   0          11h
kube-system    kube-proxy-rz44k                     1/1     Running   0          11h
kube-system    kube-scheduler-zkc-master            1/1     Running   0          11h# 查看节点状态
kubectl get nodes
# 结果
NAME          STATUS   ROLES                  AGE   VERSION
zkc-master    Ready    control-plane,master   11h   v1.20.1
zkc-slave-1   Ready    <none>                 11h   v1.20.1
zkc-slave-2   Ready    <none>                 11h   v1.20.1
zkc-slave-3   Ready    <none>                 11h   v1.20.1# 查看集群健康状况
kubectl get cs
# 结果(发现集群不健康)
[root@zkc-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0               Healthy     {"health":"true"}                                                                             # 发现集群不健康,那么需要注释掉etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的 –port=0:
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

vim /etc/kubernetes/manifests/kube-scheduler.yaml

# Master节点再次查看集群健康状况:
kubectl get cs
# 结果
[root@zkc-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}

卸载flannel网络插件、卸载flannel网络切换calico、卸载calico网络插件

# 卸载 flanne(适用于重新安装)
# 1、找到之前的flannel yaml 的文件,执行:
kubectl delete -f kube-flannel.yml
# 2、删除cni配置文件
rm -rf /etc/cni/net.d/*
# 3、重启kubelet ,不行的话重启服务器 reboot
systemctl restart kubelet
# 4、然后查看
kubectl get pod -n kube-system
# flannel已经消失# 卸载flannel网络切换calico(yaml形式安装的flanneld切换calico)
# 1、删除flannel布署资源:
kubectl delete -f kube-flannel.yml
# 2、删除路由   (我们删除网卡会自动删除这两个网卡的路由)  ip route 查看路由
# 我们删除网卡会自动删除这两个网卡的路由
ip link delete flannel.1
ip link delete cni0
# 删掉其他路由(此前flannel配置为host-gw网络类型,没有配置就不用删除,本文档暂时没有该配置教程)
ip route del 10.81.1.0/24 via 192.168.88.172 dev ens33
ip route del 10.81.1.0/24 via 192.168.88.171 dev ens33
ip route del 10.81.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
# 3、清除网络规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 4、重启kubelet(每个节点重启kubelet)
systemctl daemon-reload
systemctl restart kubelet# 卸载calico(彻底卸载calico)
# 删除(master上执行)
kubectl  delete -f calico.yaml
# 检查所有节点上的网络,看看是否存在Tunl0
ifconfig
# 删除Tunl0
modprobe -r ipip
# 移除Calico配置文件(查看 /etc/cni/net.d/ 目录下是否存在相关文件,如:10-calico.conflist, calico-kubeconfig,calico-tls等,需要删除。)
ls /etc/cni/net.d/
rm -rf /etc/cni/net.d/*
# 重启kubelet(每个节点重启kubelet)
systemctl daemon-reload
systemctl restart kubelet

测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
# 下载nginx
kubectl create deployment nginx --image=nginx
# 查看nginx 是否下载成功
kubectl get pod
# 结果(像这样就可以了)
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-d444s   1/1     Running   0          58s# 对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看pod对外端口
kubectl get pod,svc
# 结果
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-d444s   1/1     Running   0          3m6sNAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP        11h
service/nginx        NodePort    10.1.196.63   <none>        80:30629/TCP   12s# 访问地址
http://NodeIP:Port
# 任意node节点ip+30629就可以访问()
http://192.168.182.135:30629
http://192.168.182.130:30629
http://192.168.182.133:30629
# master也可以
http://192.168.182.134:30629

安装calico网络插件(master上安装)

kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16

# calico 官网3.14安装方法
https://projectcalico.docs.tigera.io/archive/v3.14/getting-started/kubernetes/quickstart# 下载
wget https://docs.projectcalico.org/archive/v3.14/manifests/calico.yaml# 编辑 (要和 --pod-network-cidr 的 ip一致)
vim calico.yaml
-------------------------------------------------------------------------------------------------------------------
# no effect. This should fall within `--cluster-cidr`.
# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
----------------------------------------------换成-----------------------------------------------------------------
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
value: "10.81.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
-------------------------------------------------------------------------------------------------------------------# 安装网络插件
kubectl apply -f calico.yaml
kubectl apply -f https://docs.projectcalico.org/archive/v3.14/manifests/calico.yaml
# 结果(成功)
configmap "calico-config" created
customresourcedefinition.apiextensions.k8s.io "felixconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ipamblocks.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "blockaffinities.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ipamhandles.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgppeers.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgpconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ippools.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "hostendpoints.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "clusterinformations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworkpolicies.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworksets.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networksets.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networkpolicies.crd.projectcalico.org" created
clusterrole.rbac.authorization.k8s.io "calico-kube-controllers" created
clusterrolebinding.rbac.authorization.k8s.io "calico-kube-controllers" created
clusterrole.rbac.authorization.k8s.io "calico-node" created
clusterrolebinding.rbac.authorization.k8s.io "calico-node" created
daemonset.extensions "calico-node" created
serviceaccount "calico-node" created
deployment.extensions "calico-kube-controllers" created
serviceaccount "calico-kube-controllers" created# 使用以下命令确认所有 pod 都在运行。
watch kubectl get pods --all-namespaces
# 使用以下命令确认您现在在集群中有3个节点。
kubectl get nodes -o wide# 警告
# Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
# 解决(安装后会自动改,因该时安装前修改yaml但是没有试过,出现这个警告也可以不用管)
将 apiVersion 的值    apiextensions.k8s.io/v1beta1 改为 apiextensions.k8s.io/v1# 指定网卡
# 问题(这个问题有点奇怪按照这个弄了也没弄好,卸载重启,重新安装没有设置也好了,建议遇到这个问题重启一下试一试,不行在进行如下操作)
[root@zkc-master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
default       nginx-6799fc88d8-d444s                     1/1     Running   3          47h
kube-system   calico-kube-controllers-6dfcd885bf-lr498   1/1     Running   0          16m
kube-system   calico-node-9hfh8                          1/1     Running   0          16m
kube-system   calico-node-r429k                          0/1     Running   0          16m   # 这里时0/1 有问题
kube-system   calico-node-rn5jv                          1/1     Running   0          16m
kube-system   calico-node-tkrw2                          1/1     Running   0          16m
kube-system   coredns-7f89b7bc75-gp9ff                   1/1     Running   3          2d11h
kube-system   coredns-7f89b7bc75-lqpsm                   1/1     Running   3          2d11h
kube-system   etcd-zkc-master                            1/1     Running   3          2d11h
kube-system   kube-apiserver-zkc-master                  1/1     Running   3          2d11h
kube-system   kube-controller-manager-zkc-master         1/1     Running   2          25h
kube-system   kube-proxy-5p6vd                           1/1     Running   3          2d11h
kube-system   kube-proxy-bmt6k                           1/1     Running   3          2d11h
kube-system   kube-proxy-bvr48                           1/1     Running   3          2d11h
kube-system   kube-proxy-rz44k                           1/1     Running   3          2d11h
kube-system   kube-scheduler-zkc-master                  1/1     Running   4          25h
# 解决
# 查看日志
kubectl describe pod calico-node-r429k -n kube-systemkubectl logs -f calico-node-r429k -n kube-system  # felix/int_dataplane.go 407: Can't enable XDP acceleration. error=kernel is too old (have: 3.10.0 but want at least: 4.16.0)vim calico.yaml
# Cluster type to identify the deployment type
- name: CLUSTER_TYPEvalue: "k8s,bgp"
# 新添加如下
- name: IP_AUTODETECTION_METHODvalue: "interface=eth.*"      #或者 value: "interface=eth0"
# Auto-detect the BGP IP address.
- name: IPvalue: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIPvalue: "Always"

kubectl命令

# 查看版本
kubectl version --client# 查看节点的负载
kubectl top nodes# 查看pod的负载
kubectl top pods -n kube-system# 查看集群健康状况(Master)
kubectl get cs# 对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort# 查看pod对外端口
kubectl get pod,svc

k8s集群部署方式(kubeadm方式安装k8s)相关推荐

  1. Kubernetes(三):k8s集群部署之kubeadm

    k8s部署环境 公有云环境:AWS.腾讯云.阿里云等等 私有云:OpenStack.vSphere等 Baremetal环境:物理服务器或独立虚拟机(底层没有云环境).    k8s部署方式 Mini ...

  2. 项目四 CentOS使用kubeadm部署工具部署测试环境的K8s集群---Kubectl命令使用以及安装dashboard界面

    大家好,我是SuieKa.在之前呢有幸学习了马哥教育提供的K8s入门指南以及视频.初来乍到,写一篇关于K8s的介绍以及部署测试环境使用的K8s集群. 树 @·K8s入门简单介绍 一.K8s(Kuber ...

  3. Rancher2.x安装及k8s集群部署

    安装Rancher Rancher是业界唯一完全开源的企业级容器管理平台,为企业用户提供在生产环境中落地使用容器所需的一切功能与组件. Rancher2.0基于Kubernetes构建,使用Ranch ...

  4. 【好文收藏】K8S集群部署CoreDNS服务

    K8S集群部署CoreDNS服务 k8s集群中的应用通常是通过ingress实现微服务发布的,前文介绍过在K8S集群中使用traefik实现服务的自动发布,其实现方式是traefik通过集群的DNS服 ...

  5. 【k8s系列001】K8s集群部署H2O

    一.k3s集群部署 https://docs.rancher.cn/docs/k3s/_index k3s官网 1.安装master curl -sfL http://rancher-mirror.c ...

  6. 利用k8s集群部署第一个容器化应用

    准备工作 按照这篇文章描述的流程搭建好k8s集群. 部署nginx Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernete ...

  7. 【运维】K8S集群部署系列之ETCD集群搭建(四)

    ETCD集群扩容和缩容 本文将介绍生产环境下如何对ETCD集群进行扩容和缩容. 文章目录 ETCD集群扩容和缩容 新节点环境准备(node3) 下载安装包并初始化环境 网络准备 生成`node3`对等 ...

  8. Elasticsearch集群部署及Head插件安装

    首先准备三台Linux服务器,系统版本Centos7,具备Java环境,最好是JDK11以上.由于ES比较吃内存,所以每台服务器的配置要求为: CPU:2核 内存:2G 我的三个节点分别是Hadoop ...

  9. k8s集群部署springboot项目

    一.前言 本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是: 部署SpringBoot项目到阿里云服务器 : 基于容器打包 ...

  10. 【k8s完整实战教程3】k8s集群部署kubesphere

    系列文章:这个系列已完结,如对您有帮助,求点赞收藏评论. 读者寄语:再小的帆,也能远航! [k8s完整实战教程0]前言 [k8s完整实战教程1]源码管理-Coding [k8s完整实战教程2]腾讯云搭 ...

最新文章

  1. SAP MM 进销存报表优化小记
  2. gem ransack(4000✨) 简单介绍
  3. 使用Disruptor实现生产者和消费者模型
  4. 2013计算机大纲,2013计算机应用基础考试大纲
  5. supervisord管理进程详解
  6. Firefox 66 将阻止自动播放音频和视频
  7. linux下 如何调试php,linux下使用gdb对php源码调试
  8. 【UVALive - 3126】Taxi Cab Scheme (二分图,最小路径覆盖)
  9. 机器学习预测+akshare
  10. OpenCV——绘制基本图形
  11. Remoting: Server encountered an internal error
  12. java Android SDK安装与环境变量配置以及开发第一个Android程序
  13. 商务统计_13 使用excel拟合曲趋势线
  14. FPN网络详解——feature pyramid network
  15. SAXReader解析器
  16. bat计算机清理原理,电脑清理系统垃圾bat的操作步骤
  17. px和毫米的换算_px和mm换算(px相当于多少毫米)
  18. 统一社会信用代码校验-JavaScript
  19. 创建视图,修改视图,修改视图数据
  20. 如何知道PDF是不是正常的A4大小尺寸?

热门文章

  1. Linux下开MC服务器
  2. 得到《三体》听书笔记
  3. ibm dsa生成html,IBMxSerial服务器故障诊断工具DSA
  4. Tian Ji -- The Horse Racing(田忌赛马)/贪心算法
  5. springboot一键启动
  6. 超级计算机预测2月有雪寒潮,寒潮连续南下,冷冬毋庸置疑?权威专家:到明年二月底最终确定...
  7. 【Windows11】Cuda和Cudnn详细安装教程
  8. The Biggest Water Problem(水题)
  9. 一文读懂TDengine的窗口查询功能
  10. 安全大数据的7个V——大数据基础问题与信息安全的交叉探究