kubernetes(k8s)笔记总结(代码片段)

IT_Holmes IT_Holmes     2023-02-24     368

关键词:

提示:kubernetes篇章开启。

文章目录

1. 云平台


国内常见云平台:

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

国外常见云平台:

  • 亚马逊 AWS、微软 Azure …

注册云平台:

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

Kubernetes就是青云开源的项目。

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

云服务器按量付费的好处:

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


集群的一个小知识点:

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


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

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

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

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

例如:192.168.0.0/16:

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

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

可以通过一些网络计算器得到二进制对应数据:

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


注意:其中,网络(192.168.0.0) 和 广播(192.168.255.255)不能分配,因此不可用!

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

  • 一般一个VPC下面有多个交换机。

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

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


服务器配置:

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架构如下:

有决策的、存资料的、调度的、传递消息的、管理节点的等等一些系列角色之间的来回交互,实现整个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集群非常方便。

架构方式如下:

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


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

  • 一台主节点、两台子节点。

三台服务器都分配到一个VPC下面,通过分配的内网IP,之间来回ping通即可。

没有公网还需要申请公网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

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

看到这句话就代表初始化成功了:
根据英文意思不难翻译出以下几个内容:


上图复制:

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


踩坑:

# 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 # 查看节点是否准备成功。

等了好久终于启动起来了。

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

注意:只有主节点才能使用kubectl命令,在其他节点上只会被拒绝。

第二步:同样还是要等所有的pods应用都就绪才执行下一步操作。

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

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


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


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

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


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

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


上面对应的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应用一下这个配置即可。

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

#获取访问令牌
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"

这样dashboard就部署好了。

kubernetes(k8s)笔记总结(代码片段)

提示:kubernetes篇章开启。文章目录1.云平台2.私有网络VPC(重点!!!)3.Kubernetes介绍4.k8s架构5.kubectl和kubeadm6.三台云服务器的安装部署7.Kubernetes环境搭建7.1安装docker环境7.2安装k8s的预备环境8.kubernetes集群安装的三大... 查看详情

kubernetes(k8s)笔记总结(代码片段)

提示:针对kubernetes的工作均衡学习。文章目录1.Kubernetes创建资源方式2.Kubernetes操作NameSpace3.Kubernetes的Pod应用3.1Pod的解释3.2通过命令行来创建一个pod3.3配置文件方式创建一个Pod3.4dashboard可视化操作Pod3.5针对Pod的一些细节操作3.6... 查看详情

kubernetes(k8s)笔记总结(代码片段)

提示:针对kubernetes的服务网络学习。文章目录一、Kubernetes的Service服务发现ClusterIP方式1.Service介绍2.Service暴露ClusterIP的方式(集群内部访问)3.Service暴露NodePort方式(集群外也可以访问)二、Kubernets之Ingress1.Ingress介绍2.Ingress安装3.I... 查看详情

kubernetes集群搭建总结(代码片段)

1、安装kubelet、kubeadm、kubectl2、查看所需镜像命令:kubeadmconfigimageslist结果:k8s.gcr.io/kube-apiserver:v1.18.3k8s.gcr.io/kube-controller-manager:v1.18.3k8s.gcr.io/kube-scheduler:v1.18.3k8s.gcr.io/kube-proxy:v1.18. 查看详情

关于kubernetes中kube-scheduler的一些笔记(代码片段)

写在前面学习K8s,整理这部分知识博文内容主要涉及K8s中调度组件kubeScheduler的一些总结主要参考《K8s权威指南》一书食用方式:需要k8s基础知识需要了解pod基本调度行为张牙舞爪的人,往往是脆弱的。因为真正强大... 查看详情

kubernetes的学习(代码片段)

kubernetes的学习本篇学习笔记总结自https://k8s.easydoc.net/,https://www.bilibili.com/video/BV1Tg411P7EB/安装k8s集群主节点需要的组件docker(也可以是其他容器运行时)kubectl集群命令行交互工具kubeadm集群初始化工具工作节点需要的... 查看详情

k8s读书笔记-kubernetes基本概念和术语(上)(代码片段)

k8s资源控制系统k8s中大部分概念如:Node、Pod、ReplicationController、RS、Deployment、Service等都可以被看作一种资源对象,激活所有的资源对象都可以通过k8s提供kubectl工具(或者API编程调用)执行CRUD等操作并将其保存在... 查看详情

k8s读书笔记-kubernetes基本概念和术语(下)(代码片段)

DevOps前言上一篇文章中,我们介绍了k8s中的Master、Node、Pod、Label、RC&RS、Deployment、HPA&VPA、DaemonSet这些资源对象信息,接下来我们继续介绍k8s中常用的资源对象。StatefulSet在k8s系统中,Pod的管理对象RC、Deployment、D... 查看详情

kubernetes(k8s)容器管理“扫盲“学习笔记(代码片段)

写在前面看着Activiti官网的博客教程学Activiti7,需要用这个,之前看有些运维岗需要学,所以了解一下。笔记是看视频学的时候做的笔记内容包含对K8S的一个基本认识。建议学习的时候可以先了解一些基本的编排工具&... 查看详情

k8s及常用指令使用总结(代码片段)

一、Kubernetes是什么?Kubernetes(K8S)是由Google设计的用于自动化部署、大规模可伸缩、管理容器化应用程序的开源的容器编排引擎,目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规... 查看详情

kubernetes带你从头到尾捋一遍(代码片段)

Kubernetes最全k8s技术实践Kubernetes软件架构❤Kubernetes安装KubernetesPod实现原理Kubernetes之Pod实现原理Harbor仓库企业级环境中基于Harbor搭建❤K8s服务发现Service服务Ingress服务K8s数据存储ConfigMapSecretVolumeK8s集群调度K8s常用命令Kubernetes工具... 查看详情

kubernetes管理员认证(cka)考试笔记(代码片段)

写在前面嗯,准备考cka证书,报了个班,花了一个月工资,好心疼呀,一定要考过去。这篇博客是报班听课后整理的笔记,适合温习。博文内容涉及docker,k8s;写的有点多了,因为粘贴了代码,... 查看详情

关于kubernetes中networkpolicy(网络策略)方面的一些笔记(代码片段)

写在前面学习k8s遇到整理笔记博文内容主要涉及Kubernetes网络策略理论简述K8s中网络策略方式:egress和ingress的DemoipBlock,namespaceSelector,podSelector的网络策略规则Demo混吃等死,小富即安,飞黄腾达,是因为各有各的缘... 查看详情

kubernetes管理员认证(cka)考试笔记(代码片段)

写在前面嗯,准备考cka证书,报了个班,花了一个月工资,好心疼呀,一定要考过去。这篇博客是报班听课后整理的笔记,适合温习。博文内容涉及docker,k8s;写的有点多了,因为粘贴了代码,... 查看详情

kubernetes管理员认证(cka)考试笔记(代码片段)

写在前面嗯,准备考cka证书,报了个班,花了一个月工资,好心疼呀,一定要考过去。这篇博客是报班听课后整理的笔记,适合温习。博文内容涉及docker,k8s;写的有点多了,因为粘贴了代码,... 查看详情

云原生|kubernetes篇深入kubernetes(k8s)概念(代码片段)

文章目录深入Kubernetes(k8s)概念一、基础概念理解二、kubernetesObjects(k8s对象)1、什么是k8s对象2、描述k8s对象3、k8s对象yaml的结构4、管理k8s对象5、对象名称6、名称空间7、标签和选择器8、注解annotation9、字段选... 查看详情

k8s------kubernetes概述(代码片段)

目录一.Kubernetes概述1.Kubernetes概念2.为什么要用Kubernetes3.Kubernetes解决的问题4.Kubernetes的特性二.Kubernetes集群架构与组件1.核心组件①Master组件Kube-apiserverKube-controller-managerKube-scheduler②配置存储中心etcd③Node组件KubeletKube-Proxyd 查看详情

k8s------kubernetes概述(代码片段)

目录一.Kubernetes概述1.Kubernetes概念2.为什么要用Kubernetes3.Kubernetes解决的问题4.Kubernetes的特性二.Kubernetes集群架构与组件1.核心组件①Master组件Kube-apiserverKube-controller-managerKube-scheduler②配置存储中心etcd③Node组件KubeletKube-Proxyd 查看详情