Kubermetes (K8S) 安装

参考文档:

官方文档:

https://kubernetes.io/zh-cn/docs/concepts/overview/components/#node-components

安装参考文档:

尚硅谷

https://www.yuque.com/leifengyang/oncloud/ghnb83

https://www.bilibili.com/video/BV13Q4y1C7hS?p=32&spm_id_from=pageDriver&vd_source=a68414cd60fe26e829ce1cdd4d75a9e6

易文档:

https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/9EX8Cp45

集群安装

裸机搭建(Bare Metal)

二台服务器centos7.6

一台做master

两台做node

  1. 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

一台或多台机器,操作系统 CentOS7.x-86_x64

硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点

安装docker

# 移除以前docker相关包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine # 安装yum工具包
sudo yum install -y yum-utils #配置docker的yum地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装指定版本
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6 # 启动&开机启动docker
systemctl enable docker --now # docker加速配置
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl status docker
docker info

1、k8s基础环境

所有机器执行以下操作

# 每个节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2 # 查看主机名
hostname # 所有节点都修改 hosts 以自己服务器的ip为准
cat >> /etc/hosts << EOF
192.168.0.111 master
192.168.0.112 node1
192.168.0.113 node2
127.0.0.1 localhost
EOF # 时间同步
yum install ntpdate -y
/usr/sbin/ntpdate -u pool.ntp.org # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config ### 关闭swap 禁止swap分区 swapoff -a
sed -i "s/\/dev\/mapper\/centos-swap/\#\/dev\/mapper\/centos-swap/g" /etc/fstab #允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF sudo sysctl --system # 所有节点确保防火墙关闭
systemctl stop firewalld
systemctl disable firewalld # 检查防火墙状态
firewall-cmd --state # 关闭规则
systemctl stop iptables
systemctl disable iptables
systemctl status iptables ### 配置节点间ssh互信(可以跳过) 配置ssh互信,那么节点之间就能无密访问,方便日后执行自动化部署 # 在master主节点上执行
ssh-keygen # 每台机器执行这个命令, 一路回车即可
ssh-copy-id node1 # 要主节点上执行从master上拷贝公钥到其他node1节点(这里node1为从节点的主机名,也可以写ip地址),这里需要输入 yes和密码
# 从主节登陆到从节点
ssh node1 # 在node1从节点上执行
ssh-keygen
ssh-copy-id master # 从node1上拷贝公钥到其他master节点这里需要输入 yes和密码
# 在从节点上登录到主节点
ssh master

安装kubelet、kubeadm、kubectl

所有机器执行以下操作

# 添加 k8s 安装源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF # 安装所需组件
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes sudo systemctl enable --now kubelet ## 启动 kubelet、docker,并设置开机启动(所有节点)
#重新加载服务的配置文件
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl status kubelet systemctl restart kubelet(跳过) # 查看版本
kubelet --version
kubeadmin version

使用kubeadm引导集群

1. 下载各个机器需要的镜像

所有服务器都执行

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF chmod +x ./images.sh && ./images.sh

2. 初始化主节点


#所有机器添加master域名映射,以下需要修改为自己的master节点的ip
echo "192.168.31.110 cluster-endpoint" >> /etc/hosts # 失败了可以用 kubeadm reset 重置
# 重新初始化
kubeadm reset # 先重置
y #确认 #下面命令仅在master主节执行,点初始化 advertise-address为自己的master节点的ip,其它不用改 kubeadm init \
--apiserver-advertise-address=192.168.0.111 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all # 查看日志
journalctl -xeu kubelet
journalctl -fu kubelet # 解决:k8s[kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with
# 参考:
# https://blog.csdn.net/leisurelen/article/details/117392370

初使化报错

报错一:
你这个错误 curl -sSL http://localhost:10248/healthz,本地配host了么
解决:配置本地hosts
127.0.0.1 localhost 报错二:
7月 03 17:41:45 master kubelet[115473]: E0703 17:41:45.730879 115473 kubelet.go:2183] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotRe
7月 03 17:41:50 master kubelet[115473]: W0703 17:41:50.460817 115473 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d
解决方法:
docker pull quay.io/coreos/flannel:v0.10.0-amd64
mkdir -p /etc/cni/net.d/
cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml 报错三:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
解决:
原因:kubernetes master没有与本机绑定,集群初始化的时候没有绑定,此时设置在本机的环境变量即可解决问题。
source /etc/profile
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile 报错四:
初始化K8S master时报错 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. 或者一直报下面的错 7月 05 00:36:34 master kubelet[106102]: E0705 00:36:34.627900 106102 controller.go:144] failed to ensure lease exists, will retry in 200ms, error: Get "https://192.168.0.111:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/master?timeout=10s": dial tcp 192.168.0.111:6443: connect: connection refused 解决 参考下面的连接:
原文链接:https://blog.csdn.net/qq_26129413/article/details/122207954 我正好相反,我把`"exec-opts": ["native.cgroupdriver=systemd"]` 从 `vim /etc/docker/daemon.json` 里删除,
再重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl status docker
docker info
然后再

返回这个成功

[addons] Applied essential addon: kube-proxy

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 192.168.0.111:6443 --token pgshih.lqxd8nxo0stohgzt \
--discovery-token-ca-cert-hash sha256:39b46cd80f5810e06fa255debf442d5a5880f97fdb2ca1b48a680c42cee36a48

上面kubeadm join 192.168.31.110:6443 --token 09umch.j47h1kyxx44znbtc ... 就是把工作节点(从节点)加到master主节点的token(24小时内有效)

新令牌

kubeadm token create --print-join-command

按上面的提示在master主节点执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看是否成功

[root@master home]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 28m v1.20.9

至此,master已经安装成功了

安装网络插件 calico是k8s集群安装所用到的网络组件,calico与fannel相比具有访问控制功能,复杂性也更高些。

# master执行下载
# 如果下载不了,可以在浏览器里打开下载,上传到服务器上
wget https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

报错:

error: unable to recognize "calico.yaml": no matches for kind "PodDisruptionBudget" in version "policy/v1"
解决:
k8s-v1.20.9支持的最新版calico是v3.21
故正确获取calico的yaml文件应该用:
wget http://docs.projectcalico.org/archive/v3.21/manifests/calico.yaml --no-check-certificate 然后再执行
kubectl apply -f calico.yaml 另外, 查看calico支持的k8s对应版本可以在calico官网查看
https://projectcalico.docs.tigera.io/archive/v3.20/getting-started/kubernetes/requirements

常用命令:

master上使执行

#查看集群所有节点
kubectl get nodes #根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml #查看集群部署了哪些应用?
docker ps === kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A
# 每一秒刷新一次
watch -n 1 kubectl get pod -A # 查看pod详情
kubectl describe pod calico-node-rsmm8 --namespace=kube-system
kubectl describe pod calico-kube-controllers-5cdbdf5595-dxnzd --namespace=kube-system #kubectl delete 常用命令
#https://www.cjavapy.com/article/2420/
# 通过yaml文件删除
kubectl delete -f calico_v3.21.yaml
# 删除单个pod
kubectl delete pod calico-node-x2bfz -n kube-system
# 报错
[root@master home]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5cdbdf5595-dxnzd 0/1 ImagePullBackOff 0 18m
kube-system calico-node-rsmm8 0/1 Init:ImagePullBackOff 0 18m # 查看详情
kubectl describe pod calico-node-rsmm8 --namespace=kube-system
kubectl describe pod calico-kube-controllers-5cdbdf5595-dxnzd --namespace=kube-system
kubectl describe pod calico-node-xlpxv --namespace=kube-system
kubectl describe pod calico-kube-controllers-5cdbdf5595-gkpfq --namespace=kube-system
kubectl describe pod calico-node-5bp25 --namespace=kube-system
kubectl describe pod calico-node-fd5v7 --namespace=kube-system
kubectl describe pod coredns-7f89b7bc75-98dz4 --namespace=kube-system
kubectl describe pod coredns-7f89b7bc75-xvr57 --namespace=kube-system Warning Failed 10m (x4 over 19m) kubelet Error: ErrImagePull
Normal BackOff 9m48s (x8 over 19m) kubelet Back-off pulling image "docker.io/calico/cni:v3.21.5"
Warning Failed 4m54s (x22 over 19m) kubelet Error: ImagePullBackOff Warning Failed 9m35s (x4 over 17m) kubelet Error: ErrImagePull
Normal BackOff 9m7s (x7 over 17m) kubelet Back-off pulling image "docker.io/calico/kube-controllers:v3.21.5"
Warning Failed 23s (x29 over 17m) kubelet Error: ImagePullBackOff Normal BackOff 49s (x2 over 2m55s) kubelet Back-off pulling image "docker.io/calico/pod2daemon-flexvol:v3.21.5"
Warning Failed 49s (x2 over 2m55s) kubelet Error: ImagePullBackOff Normal BackOff 8m34s (x53 over 46m) kubelet Back-off pulling image "docker.io/calico/node:v3.21.5"
Warning Failed 3m36s (x67 over 46m) kubelet Error: ImagePullBackOff # 从上面可以看到拉取镜像超时了,
哎,明天换个网再操作 无奈

终于pull到这两个镜像

[root@master home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
calico/kube-controllers v3.21.5 86014674e404 2 months ago 131MB
calico/cni v3.21.5 a830f00c4814 2 months ago 235MB
# 通过yaml文件删除
kubectl delete -f calico_v3.21.yaml
# 再启动pod
kubectl apply -f calico_v3.21.yaml

Kubernetes(K8S)安装的更多相关文章

  1. Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    背景: 由于工作发生了一些变动,很长时间没有写博客了. 概述: 这篇文章是为了介绍使用kubeadm安装Kubernetes集群(可以用于生产级别).使用了Centos 7系统. 一.Centos7 ...

  2. Kubernetes(K8S) kubesphere 安装

    安装KubeSphere最好的方法就是参考官方文档,而且官方文档是中文的. 官网地址:https://kubesphere.com.cn/ https://github.com/kubesphere/ ...

  3. Kubernetes(K8S) kubesphere 介绍

    使用 Kubeadm 部署 Kubernetes(K8S) 安装--附K8S架构图 官网地址:https://kubesphere.com.cn/ KubeSphere 是个全栈的Kubernetes ...

  4. ubuntu16.04 docker kubernetes(k8s) istio 安装

    版本: docker: 19.03.5 kubernetes: 1.17.0 istio: 1.4.3 步骤一:给ubuntu换源 https://www.cnblogs.com/lfri/p/106 ...

  5. Kubernetes(k8s)完整安装教程

    Kubernetes(k8s)完整安装教程  2019-08-27 2.3k 记录 发表评论 目录 1 安装 1.1 安装 Docker 1.2 安装 VirtualBox 1.3 安装 kubect ...

  6. Centos7 安装部署Kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...

  7. Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14

    目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...

  8. 深入剖析Kubernetes k8s

    深入剖析Kubernetes k8s 毫无疑问,Kubernetes 已经成为容器领域当之无愧的事实标准.除了 Google.Microsoft 等技术巨擘们在容器领域里多年的博弈外,国内的 BAT. ...

  9. Kubernetes(k8s) docker集群搭建

    原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背 ...

  10. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

随机推荐

  1. mybatis一次执行多条SQL语句报错

    如果这样来写一个 mapper 1 <update id="createTable3" parameterType="map"> 2 drop ta ...

  2. 关于商业智能(Business Intelligence,简称BI)的认识

    一.早期(1958年)定义 商业智能描述了一系列的概念和方法,通过应用基于事实的支持系统来辅助商业决策的制定. 二.帆软数据调研 帆软数据应用研究院对770多家企业的1400多名从业人员进行了调研(云 ...

  3. MySQL插入更新删除数据

    数据插入 插入完整的行 INSERT INTO customers VALUES(NULL, 'Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA ...

  4. #结论#洛谷 3199 [HNOI2009]最小圈

    题目 求有向图最小平均权值回路. \(n\leq 3*10^3,m\leq 10^4\) 分析 设 \(f_k(x)\) 表示从点 \(x\) 出发恰好走 \(k\) 条边的最短路, 那么答案就是 \ ...

  5. #Dijkstra,二进制拆位#洛谷 5304 [GXOI/GZOI2019]旅行者

    题目 分析(\(logk\)次Dijkstra) 首先为什么\(O(nklogn)\)的多次\(dijkstra\)为什么会TLE, 因为中间有许多的冗余状态,即使两点求出的路径是最短的,它也不一定是 ...

  6. OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器

     @Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景.不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参 ...

  7. winrt新dx截图最小实现

    转自:https://stackoverflow.co/questions/11283015 效果还是很不错的 #include <iostream> #include <Windo ...

  8. 深入解析 C 语言中的 for 循环、break 和 continue

    C语言中的 for 循环 当您确切地知道要循环执行代码块的次数时,可以使用 for 循环而不是 while 循环 for (语句 1; 语句 2; 语句 3) {   // 要执行的代码块 } 语句 ...

  9. C#中yield return的作用

    C#中yield return的作用 yield return作用在 return 时,保存当前函数的状态,下次调用时继续从当前位置处理.示例说明如下代码所示,主函数使用 foreach 输出 Get ...

  10. mybatis复习(二)

    简介 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的 ...