Kubernetes(k8s) 笔记总结(一)

时间:2023-01-09 20:56:45

1. 云平台


国内常见云平台:

  • 阿里云、百度云、腾讯云、华为云、青云…

国外常见云平台:

  • 亚马逊 AWS、微软 Azure …

注册云平台:

  • 阿里云 aliyun.com
  • 腾讯云 cloud.tencent.com
  • 华为云 cloud.huawei.com
  • 青云 qingcloud.com
  • 百度云 cloud.baidu.com

Kubernetes就是青云开源的项目。

环境:准备一台云服务器(按量付费) 、搭建好nginx环境。

云服务器按量付费的好处:
Kubernetes(k8s) 笔记总结(一)

2. 私有网络 VPC(重点!!!)


集群的一个小知识点:
Kubernetes(k8s) 笔记总结(一)

集群之间的访问一般都是走私有IP进行访问。一方面私有IP访问快,也无需担心宽带等情况。


可以去阿里云配一个VPC私有网络。

VPC概念:私有网络 也叫 专有网络。

首先,理解子网掩码概念:

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。

例如:192.168.0.0/16:

  • 后面的16:代表16位掩码。

在线网络计算器:https://www.sojson.com/convert/subnetmask.html

可以通过一些网络计算器得到二进制对应数据:
Kubernetes(k8s) 笔记总结(一)

定义的18位掩码那就是对应ip二进制的前18位固定,后面的可以动态变化,以此进行分配ip的效果。

Kubernetes(k8s) 笔记总结(一)
注意:其中,网络(192.168.0.0) 和 广播(192.168.255.255)不能分配,因此不可用!

交换机:可以继续向下进行分配管理IP。

  • 一般一个VPC下面有多个交换机。
    Kubernetes(k8s) 笔记总结(一)

总而言之,VPC就是起到了一个局域隔离的效果,好处就是多个微服务或者其他系统服务器,只要都处于同一个VPC下就可以相互互通,无需访问外网。效果更好,安全更高

一般公司,开发环境、测试环境、生产环境各都有一个VPC。


服务器配置:
Kubernetes(k8s) 笔记总结(一)

3. Kubernetes 介绍


Kubernetes的作用就是负责管理的docker容器的。(专业术语:大规模容器编排系统。)

平时,创建一两个docker容器,手动操作命令,还算方便。但是,如果是几十个、上百个docker容器管理起来就非常麻烦。

官方网站:https://kubernetes.io/zh-cn/

kubernetes特性:
● 服务发现和负载均衡(容器发现 和 分配请求)
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
● 存储编排 (创建一个容器就要有对应的存储,可以让k8s来管理。)
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
● 自动部署和回滚 (自动部署项目 和 回滚到之前版本等)
你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
● 自动完成装箱计算 (管理容器指标之类的)
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
● 自我修复 (自我修复)
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
● 密钥与配置管理 (管理配置的东西)
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

总而言之,k8s提供了一个可弹性运行分布式系统的框架。

k8s也可以轻松管理系统的Canary部署(灰度发布)。

4. k8s 架构


k8s工作方式:
Kubernetes Cluster = N Master Node + N Worker Node:N主节点+N工作节点; N>=1 (集群架构常用的一种策略。)

硅谷老师解释的k8s架构如下:
Kubernetes(k8s) 笔记总结(一)
有决策的、存资料的、调度的、传递消息的、管理节点的等等一些系列角色之间的来回交互,实现整个k8s。


Control Plane(控制面板,总部):(master node 主节点)

  • kubectl:是程序员要操作的命令行,发给controller-manager。其实真正的决策者是kubectl
  • Control Plane(控制面板,总部):就是master节点,来操作worker 节点。并且自身由多个集群节点组成。
  • controller-manager(决策者):负责决策发号施令。
  • API server(秘书部)作用:控制集群之间的交互访问,保证每个server、节点的互通
  • ETCD(键值数据库):存储一些配置。
  • scheduler(调度者):动态计算一些内容,并且调度。

worker node 工作节点:

  • kubelet(厂长):负责管理worker node。
  • k-proxy(门卫大爷):node节点中的k-proxy与其他节点的k-proxy是同步的,相当于一个导游,起到一个指引的作用。因此,k-proxy是负责管理所有集群里面的网络访问的

5. kubectl 和 kubeadm


kubectl(kube control):一些k8s命令,由程序员操作。

kubeadm(kube admin):帮助程序员管理集群的。

  • 使用kubeadm来管理搭建k8s集群非常方便。

架构方式如下:
Kubernetes(k8s) 笔记总结(一)

6. 三台云服务器的 安装部署


先准备三台云服务器(按需付费即可,不用时关闭!)。

  • 一台主节点、两台子节点。
    Kubernetes(k8s) 笔记总结(一)

三台服务器都分配到一个VPC下面,通过分配的内网IP,之间来回ping通即可。
Kubernetes(k8s) 笔记总结(一)
没有公网还需要申请公网IP。

7. Kubernetes 环境搭建

7.1 安装docker环境


给三台机器安装Docker环境:

# 1. 卸载之前版本docker(一般不用)
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2. 安装一些yum-utils工具
sudo yum install -y yum-utils
# 3. 配置docker的yum源,就是告诉linux去哪里下载docker
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 一般默认下载最新版本的docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 以下是在安装k8s的时候使用
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

# 5. 配置docker加速镜像(阿里云搜索就行) 跳过
# 之后,进行查看是否配置成功
docker info 

# 6. 之后就是启动docker等操作。

7.2 安装k8s的 预备环境


服务器要求:

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存) 和 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
    • 设置防火墙放行规则
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
    • 设置不同hostname
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
    • 内网互信
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
    • 永久关闭

K8s官方要求以下相关操作:

  • 修改hostname名称 和 永久关闭交换分区。
# 1. 各个机器设置自己的域名 和 修改hostname文件一样
hostnamectl set-hostname xxxx

# 2. 将 SELinux 设置为 permissive 模式(相当于将其禁用)
# 临时禁用
sudo setenforce 0 
# 修改配置文件永久禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 3. 关闭swap分区
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 4. 允许 iptables 检查桥接流量 (流量桥接:ipv6桥接到ipv4网卡上)
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

8. kubernetes集群 安装的三大件(kubelet、kubeadm、kubectl)


kubeadm(kube admin)、kubectl(kube control)、kubelet(厂长)。

安装kubelet、kubeadm、kubectl:

# 1. 配置阿里的kubernetes的yum镜像。
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

# 2. 安装kubelet、kubeadm、kubectl
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

# 3. 启动kubelet
sudo systemctl enable --now kubelet

kubelet 现在每隔几秒就会重启,因为它陷入一个等待kubeadm指令的死循环。因此,通过systemctl status kubelet检查状态的时候有时候正常,有时候关闭。

9. kubernetes集群 初始化主节点


第一步:下载各个机器需要的镜像(可以考虑按需引入,哪个节点需要啥就拉下啥,目前为了防止用到就每个节点全部下载下来了)。

# 1. 生成一个images.sh脚本文件
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

# 2. 执行脚本文件
chmod +x ./images.sh && ./images.sh

# 上面就是写了个脚本循环执行docker pull命令没什么困难。

第二步:添加主节点域名,并且初始化主节点。

# 1. 所有机器添加master域名映射(以下需要修改为自己的)
# 此处用的是VPC内网的地址,不是公网!通过ip a命令查看。
echo "172.31.0.2  cluster-endpoint" >> /etc/hosts


# 2. 主节点初始化(只在master节点进行初始化。)
kubeadm init \
# apiserver-advertise-address对应master所在节点的ip
--apiserver-advertise-address=172.31.0.2 \
# control-plane-endpoint控制面板:这里对应上面master的域名。
--control-plane-endpoint=cluster-endpoint \
# 镜像仓库阿里云的
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
# k8s的版本
--kubernetes-version v1.20.9 \
# service的网络范围 
--service-cidr=10.96.0.0/16 \
# network的网络范围
--pod-network-cidr=192.168.0.0/16

# 要注意:上面的所有网络范围是不能重叠的。

Kubernetes(k8s) 笔记总结(一)

看到这句话就代表初始化成功了:Kubernetes(k8s) 笔记总结(一)
根据英文意思不难翻译出以下几个内容:
Kubernetes(k8s) 笔记总结(一)
Kubernetes(k8s) 笔记总结(一)
上图复制:

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join cluster-endpoint:6443 --token hums8f.vyx71prsg74ofce7 \
    --discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3 \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join cluster-endpoint:6443 --token hums8f.vyx71prsg74ofce7 \
    --discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3

可以通过kubectl get nodes命令查看集群所有节点:

[root@k8s-master ~]  mkdir -p $HOME/.kube
[root@k8s-master ~]  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]  sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]  kubectl get nodes
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   6m35s   v1.20.9

第三步:根据提示安装一个网络组件(只在master节点运行)。

# 1. 下载calico的配置文件
curl https://docs.projectcalico.org/manifests/calico.yaml -O

# 2. kubectl通过这个文件进行一些列的下载安装配置操作。
kubectl apply -f calico.yaml

第四步:查看kubectl里面运行了几个Pod。

  • 运行中的应用在docker里面叫容器,在k8s里面叫Pod。
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A

Kubernetes(k8s) 笔记总结(一)
Kubernetes(k8s) 笔记总结(一)

踩坑:
Kubernetes(k8s) 笔记总结(一)

# 1. 下载对应版本呢
curl https://docs.projectcalico.org/v3.18/manifests/calico.yaml -O
# 2. 先使用delete清除资源,再apply创建资源
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
kubectl get pods -A # 查看容器是否准备成功。
kubectl get nodes # 查看节点是否准备成功。

等了好久终于启动起来了。
Kubernetes(k8s) 笔记总结(一)

10. kubernetes集群 将Worker节点加入集群


第一步:在其他两个worker节点上,执行kubeadm join命令:

  • 在master节点,重新生成新令牌:kubeadm token create --print-join-command。
# 1. 新增workder节点。
kubeadm join cluster-endpoint:6443 --token rh26mq.26bfqa6f6ezdqna4 \
--discovery-token-ca-cert-hash sha256:dd7200e7bada2811e9f6601a3326d62ada73236d6f40efeb90deda188171931e

# 补充:初始化后刚生成的令牌时效只有24小时 或者 不小心清理了。就可以通过以下命令重新生成新令牌。在master执行以下命令:
kubeadm token create --print-join-command

# 2. 主节点上查看看
kubectl get nodes

Kubernetes(k8s) 笔记总结(一)

注意:只有主节点才能使用kubectl命令,在其他节点上只会被拒绝。
Kubernetes(k8s) 笔记总结(一)

第二步:同样还是要等所有的pods应用都就绪才执行下一步操作。
Kubernetes(k8s) 笔记总结(一)

Kubernetes(k8s) 笔记总结(一)

到了这里等所有pods应用都就绪并且status为running,k8s集群就搭建成功。

11. kubernetes集群 集群自我修复能力


无论哪个节点重启,关机,故障了。都不会影响已经搭建好的k8s集群。

Kubernetes(k8s) 笔记总结(一)
重启后可能会看到有些状态变成了error,但是不用担心!k8s会自动修复,过一段时间就会好了。

12. k8s的join令牌过期解决方式


# 在master执行以下命令:
kubeadm token create --print-join-command

Kubernetes(k8s) 笔记总结(一)

13. k8s 部署dashboard


其实就是提供了一个web的可视化页面,就不用再去通过命令行去查看了。

kubernetes官方提供的可视化界面
https://github.com/kubernetes/dashboard


第一步:直接通过官方dashboard的配置文件进行安装。

# 在master节点执行
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

第二步:同样等待pods就绪后,设置访问端口。

# 1. 在master执行以下命令,将文件中的type: ClusterIP改为type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 作用:相当于把web访问页面的端口暴露到机器上

# 2. 获取端口,找到端口,在安全组放行
kubectl get svc -A |grep kubernetes-dashboard

Kubernetes(k8s) 笔记总结(一)
上面对应的31287便是暴露后的端口,还需要配置安全组。

访问: https://集群任意IP:端口      https://139.198.165.238:31287

第三步:登录需要token令牌,所以要创建访问的账号,获取token令牌。

  • 创建一个dash.yaml文件。
#创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

之后,kubectl apply -f dash-usr.yaml k8s应用一下这个配置即可。
Kubernetes(k8s) 笔记总结(一)

最后,获取到访问令牌就可以登录了。

#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

Kubernetes(k8s) 笔记总结(一)

这样dashboard就部署好了。