文章目录
- 1. 云平台
- 2. 私有网络 VPC(重点!!!)
- 3. Kubernetes 介绍
- 4. k8s 架构
- 5. kubectl 和 kubeadm
- 6. 三台云服务器的 安装部署
- 7. Kubernetes 环境搭建
- 7.1 安装docker环境
- 7.2 安装k8s的 预备环境
- 8. kubernetes集群 安装的三大件(kubelet、kubeadm、kubectl)
- 9. kubernetes集群 初始化主节点
- 10. kubernetes集群 将Worker节点加入集群
- 11. kubernetes集群 集群自我修复能力
- 12. k8s的join令牌过期解决方式
- 13. k8s 部署dashboard
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节点运行)。
- 其他网络组件:https://kubernetes.io/docs/concepts/cluster-administration/addons/
目前,选用calico的组件。
# 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就部署好了。