K8s(kubernetes)集群搭建及dashboard安装、基础应用部署

基础介绍

概念

本质是一组服务器集群,在集群每个节点上运行特定的程序,来对节点中的容器进行管理。实现资源管理的自动化。

功能

  • 自我修复
  • 弹性伸缩
  • 服务发现
  • 负载均衡
  • 版本回退
  • 存储编排

组件

  • 控制节点(master)-控制平面

APIserver:资源操作的唯一入口
scheduler :集群资源调度,将Pod调度到node节点上
controlManager:维护集群状态,程序部署状态
Etcd:存储各种资源对象信息(数据库-可替换)

  • 工作节点(node)-数据平面,提供数据环境

Kubelet:负责维护生命周期,创建、更新、销毁docker容器
Docker:容器操作
KuberProxy:集群内部服务发现和负载均衡

概念

  • Master:控制节点

  • Node:工作节点

  • Pod: 最小工作单元,容器运行在pod上

  • Controller:控制器,实现对pod的管理

  • Service:pod的统一入口

  • Label:标签,对pod分类

  • Namespace:命名空间,隔离pod环境

工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMDSFZa4-1689145689993)(C:\Users\ricar\AppData\Roaming\Typora\typora-user-images\image-20230618235232615.png)]

集群搭建

类型:

  • 一主多从

  • 多主多从

基于三台机器搭建集群

环境配置

IP

192.168.1.220 ricardo-1    #主节点
192.168.1.221 ricardo-2    #从节点
192.168.1.222 ricardo-3    #从节点

关闭防火墙

#临时关闭
systemctl stop firewalld
#永久关闭
systemctl disable firewalld

关闭selinux

#永久关闭
sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0

关闭swap分区

# 临时关闭
swapoff -a   
# 注释到swap那一行  永久关闭
vim /etc/fstab 

设置主机名称

hostnamectl set-hostname ricardo-1
hostnamectl set-hostname ricardo-2
hostnamectl set-hostname ricardo-3

添加主机名与IP对应关系(三台主机都执行)

cat >> /etc/hosts << EOF
192.168.1.220 ricardo-1
192.168.1.221 ricardo-2
192.168.1.222 ricardo-3
EOF

将桥接的IPv4流量传递到iptables的链(三台主机都执行):

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

时间同步

yum install ntpdate -y
ntpdate time.windows.com

Docker安装

安装需要的软件包, yum-util 提供yum-config-manager功能

yum install -y yum-utils device-mapper-persistent-data lvm2

设置 yum 源(阿里云)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

选择docker版本并安装

yum list docker-ce --showduplicates | sort -r

安装

sudo yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0

配置镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://5w5kf152.mirror.aliyuncs.com"]
}
EOF

启动 Docker 并设置开机自启

systemctl restart docker && systemctl enable docker

K8s安装

添加阿里云 yum 源(都安装)

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
EOF

kubeadm、kubelet、kubectl 的安装(都安装)

版本对应关系

k8s与docker版本对应关系

#下载软件
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0#开机自启动
systemctl enable kubelet

在 Master 节点中部署集群-(只在master节点执行)

kubeadm init --kubernetes-version=1.18.0  \
--apiserver-advertise-address=192.168.1.220   \
--image-repository registry.aliyuncs.com/google_containers  \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

示例
成功示例

开启 kubectl 工具的使用(该命令在master节点中执行)

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

将 node 节点加入 master 中的集群(该命令在工作节点node中执行)。

kubeadm join 192.168.1.220:6443 --token 88gcei.gmh12c7jmh6ksgj6 \--discovery-token-ca-cert-hash sha256:8a3f8919183a5ff0fe8626615195a044a74b0ea3a004e41c013095d28eea83dc 
#重新创建
kubeadm token create --print-join-command

安装网络插件(CNI) 下面两个中选一个,

calico

# 下载calico插件的yaml
wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate#修改定义pod网络CALICO_IPV4POOL_CIDR的值
vim calico.yaml
# 修改定义pod网络CALICO_IPV4POOL_CIDR的值和kubeadm init pod-network-cidr的值一致
## 取消注释
- name: CALICO_IPV4POOL_CIDRvalue: "10.122.0.0/16"kubectl apply -f calico.yaml#查看运行状态
kubectl get pods -n kube-system[root@ricardo-1 k8s]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
ricardo-1   Ready    master   43m   v1.18.0
ricardo-2   Ready    <none>   41m   v1.18.0
ricardo-3   Ready    <none>   41m   v1.18.0

示例

pod

fannel(如果用了上面的calico就不要用这个了)

# 下载flannel插件的yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 修改kube-flannel.yml中的镜像仓库地址为国内源
sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml# 安装网络插件
kubectl apply -f kube-flannel.yml

控制台-dashboard 安装

安装

#版本地址
https://github.com/kubernetes/dashboard/releases?page=1#下载配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml#修改 39行
spec:type: NodePortports:- port: 443targetPort: 8443nodePort: 31001selector:k8s-app: kubernetes-dashboard#启动
kubectl apply -f recommended.yaml#查看
kubectl get pods -n kubernetes-dashboard#打开网页
https://192.168.1.220:31001/
鼠标点击空白处,输入:thisisunsafe #服务器生成token(master节点)#1、创建账号
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard#2、创建集群角色权限绑定
kubectl create clusterrolebinding kube-dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin#3、获取账号token
kubectl get secret -n kubernetes-dashboard | grep dashboard-adminkubectl describe secrets dashboard-admin-token-zcvnc -n kubernetes-dashboard#token  粘到 web端
eyJhbGciOiJSUzI1NiIsImtpZCI6InE5NHpxbWhwc0FmVjhhSUZ4bElhZ19JbXVfSXpPNkFhVHFyUE9vc1A5MkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temN2bmMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMTc5YjdmYzItOWU2Ny00MTcwLThkYmYtZGJlODU0MzNhM2MxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.f_klKo1n-5cg0UEFodRojtd5hTs3BTL6tFNi0G6aZWalyJuQioodkM3pW1I2d7HaIaKP61XJPRyq9YZEQp9SHsa_guCXMF83JmF5yG8G0hAQbDWyO7DnaFnoGK1RcaH5PioyVOrCOZEYwzwEPtObeXeqnVzNFI4kR1cfIpRefpuhm8dKP06PNpiQRMhLPXWThw1LmCL0OmnPlKyVJJNi2toPS7jxG3LFMhJZR_DA3jOf9kFUXL_v29V2cRzRIU1_cN0t3wsmrPahV3D7LlHAnLVRaV6L-C6X5_l88WwDebDTm4Ag20MLLRE5zeLq6lFh38FWy86IOivinSavysWuwA#修改token持续时间(默认 15分钟 600s)
修改命名空间  kubernetes-dashboard   deployment  kubernetes-dashboardcontaiiners下 args参数新增 --token-ttl=43200#日志
kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-7b544877d5-r4jjw

token
在这里插入图片描述
示意图

常用命令

# 获得节点
kubectl get nodes#查看pod
kubectl get pods -A
kubectl get pods -n kube-system
kubectl get pod -n kube-system -o wide#pod状态
kubectl describe pod coredns-57d4cbf879-xgk2f -n kube-system
kubectl logs -f coredns-57d4cbf879-xgk2f -n kube-system#查看状态
systemctl status kubeletsystemctl status kubelet.service --now#日志  -  节点日志
journalctl -f -u kubelet
journalctl -u kubelet#开机自启动
systemctl enable  kubelet
#重启
systemctl restart kubelet
#查看状态
systemctl status  kubelet#查看命名空间
kubectl get ns#创建空间
kubectl create namespace dev#重置
kubeadm reset
#reset后删除
rm -rf $HOME/.kube# 查看k8s的pod网段和svc网段  kubeadm的配置信息存在config-map中
kubectl -n kube-system describe cm kubeadm-config |grep -i pod
# 查看pod网段和svc网段
kubectl -n kube-system describe cm kubeadm-config |grep -i net

部署第一个应用-Nginx

基础介绍

概念

  • Namespace 表示命名空间:应用需在命名空间下
  • Deployment :即发布pod,因为pod是最小单位
  • Service: 暴露服务到外部的方式,包括LoadBlancer Service、NodePort Service、Ingress,即配置一个对外访问的入口

基础流程

因此,部署应用的步骤基本是 先创建命名空间, 再创建pod,再创建service

1、创建命名空间

文件:nginx-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:name: devlabels:name: dev

名词:

kind:Namespace 表示yaml文件创建的是命名空间

metadata表示命名空间的元信息

metadata.name 是命名空间的名称 取值dev

metadata.labels 是命名空间的标签 name=dev

应用

kubectl create -f namespace-dev.yaml

2、创建Deployment

文件:deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx-deployment1namespace: dev
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.14.0ports:- containerPort: 80name: nginx

以下参数自定义时可选

   spec:containers:- image: nginx:1.14.0ports:- containerPort: 80name: nginxvolumeMounts: #k8s的master服务器对应的路径,必须存在- name: confmountPath: /etc/nginx/nginx.conf- name: logmountPath: /var/log/nginx- name: htmlmountPath: /etc/nginx/htmltolerations:- key: "key"operator: "Equal"value: "nginx"effect: "NoSchedule"volumes: #k8s的node对应的路径- name: conf #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/conf/nginx.conf- name: log #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/logstype: Directory- name: html #和volumeMounts中的内容要对应hostPath:path: /Users/w/kube/nginx/htmltype: Directory

名词:

kind: Deployment表示yaml文件创建的是一个Deployment发布
metadata表示这个deployment的元信息
metadata.name 是deployment的名称 nginx-deployment1
metadata.labels 是deployment的标签 即:app=nginx
metadata.namespace 是deployment的命名空间,此处选择的是第一步创建的命名空间nginx

spec: 表示deployment的详细参数配置说明
spec.replicas 是启动几个pod节点
spec.template.spec 是deployment选择模块的详细说明
spec.template.spec.containers 表示选择的容器是什么,此处是nginx的docker镜像 nginx:1.14.0,容器的端口设置 containerPort: 80, volumeMounts表示绑定的文件和目录

spec.template.spec.volumes 表示选择的容器挂载的宿主机的文件和目录 conf, log和html

应用:

kubectl create -f deployment-nginx.yaml #初次创建
kubectl apply -f deployment-nginx.yaml #后期更新#查看
kubectl get pods -n dev
kubectl describe pod nginx-deployment1-6cb86fb6b7-kkpbw -n dev
kubectl delete pod nginx-deployment1-6cb86fb6b7-txkkj -n dev
kubectl describe deployment nginx -n dev

3、创建service

文件:service-nginx.yaml

apiVersion: v1
kind: Service
metadata:labels:app: nginxname: nginx-deployment1namespace: dev
spec:ports:- port: 9000protocol: TCPtargetPort: 80nodePort: 31090selector:app: nginxtype: NodePort

名词:

kind: Service表示yaml文件创建的是一个Service

metadata表示这个Service的元信息

metadata.name 是Service的名称 nginx-deployment1

metadata.labels 是Service的标签 即:app=nginx

metadata.namespace 是Service的命名空间,此处选择的是第一步创建的命名空间nginx

sepc是Service的详细配置说明

sepc.type 取值NodePort 表示这个Service的类型是一个节点端口转发类型

sepc.selector 表示这个Service是将带标签的哪些pods做为一个集合对外通过服务

sepc.ports.port 是Service绑定的端口

sepc.ports.name: nginx-service80 表示Service服务的名称
sepc.ports.protocol: TCP 表示Service转发请求到容器的协议是TCP,我们部署的http的nginx服务,因此选择协议为TCP
sepc.ports.targetPort: 80 表示Service转发外部请求到容器的目标端口80,即deployment的pod容器对外开放的容器端口80
sepc.ports.nodePort: 31090 表示Service对外开放的节点端口

应用

kubectl apply -f service-nginx.yaml#查看
kubectl get services -n dev
kube kubectl describe service nginx-deployment1 -n nginx
kubectl delete services nginx-deployment1 -n nginx

4、测试

地址

192.168.1.220:31090

效果:
在这里插入图片描述

报错解决

错误描述 dial tcp 10.96.0.1:443: connect: no route to host

  • systemctl stop docker
  • systemctl stop kubelet
  • iptables --flush
  • iptables -tnat --flush
  • systemctl start kubelet
  • systemctl start docker

错误 Unable to update cni config: No networks found in /etc/cni/net.d

mkdir -p /etc/cni/net.dcat > /etc/cni/net.d/10-flannel.conflist << EOF
{"name": "cbr0","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]
}
EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux ❀ Openssh 8.9p1源码升级教程

文章目录 升级操作注意事项&#xff1a;1. 安装依赖2. 执行升级2.1 上传压缩包并保存配置2.2 开始升级 升级操作注意事项&#xff1a; 编译过程需要依赖&#xff0c;必须安装完成!!!SSH服务升级过程可能会导致无法远程连接服务器!!!若必须远程登录必须确认telnet服务可用!!!升…

第四十六章Java包(package)

在编写 Java 程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也是一件很麻烦的事&#xff0c;尤其是一些同名问题的发生。有时&#xff0c;开发人员还可能需要将处理同一方面的问题的类放在同一个目录下&a…

Android - AIDL

一、概念 二、使用 2.1 Server 端 2.1.1 创建 .aidl 文件 Module右键→New→AIDL→AIDL File&#xff08;如果不可选&#xff0c;在build.gradle的buildFeatures节点添加aidl true&#xff09;。 在创建的接口中定义抽象方法。 interface IDemoAidlInterface {//自己的业…

【STM32MP135】修复EMMC模式启动时,uboot启动识别为usb0设备问题

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk.dts 文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/configs/stm32mp13_defconfig

基于霍夫变换的航迹起始算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 一、设计内容 利用Hough变换处理量测得到的含杂波的二维坐标&#xff0c;解决多目标航迹起始问题。使用Matlab进行仿真&#x…

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

k8s+springboot+CronJob 定时任务部署

kubernetesspringbootCronJob 定时任务配置如下代码&#xff1a; cronjob.yaml k8s 文件 apiVersion: batch/v1 kind: CronJob metadata:name: k8s-springboot-demonamespace: rz-dt spec:failedJobsHistoryLimit: 3 #执行失败job任务保留数量successfulJobsHistoryLimit: 5 …

2023.7月最新版idea安装Jrebel实现热部署,可解决后端启动等待时间过长问题

2023.7最新版idea热部署配置 一 下载jrebel插件二 激活我使用的方法 三 配置方式1 设置自动编译2 设置 compiler.automake.allow.when.app.running3 勾选项目&#xff0c;然后以Rebel方式启动 4 Settings查看Activation情况四 报错解决1 启动失败 2 端口被占用 五 总结 一 下载…

vue3+vite+Ts 基于Antv/x6 绘制流程图

需求效果&#xff1a; 需求&#xff1a; 实现一个流程图&#xff0c;双击可对相应的组件进行一些功能操作&#xff1b; 工具栈&#xff1a; 这里使用antv/x6&#xff0c; 基于vue3vitets进行开发 官网地址&#xff1a; https://x6.antv.antgroup.com/examples/showcase/pra…

代码随想录算法训练营第六十二天—图论补充

理论基础&#xff1a; 第一题、所有可能的路径 力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int x){if(x graph.size() - 1){result.push_back(path);retu…

科技资讯|苹果Vision Pro手部追踪和手势相关新专利曝光

近日&#xff0c;美国专利商标局正式授予苹果一项与 Apple Vision Pro 主要功能相关的专利&#xff1a;手部追踪和手指手势。 苹果专利指出&#xff0c;沉浸感的质量取决于几个重要因素。例如&#xff0c;显示器的特性&#xff0c;如图像质量、帧率、像素分辨率、高动态范围 …

vue3+mapboxgl鼠标浮动显示cgcs2000

一、需求 鼠标在地图中浮动展示地图的经纬度&#xff0c;cgcs2000 xy 还有显示带号 二、实现效果 展示经度&#xff0c;纬度&#xff0c;x值&#xff0c;y值显示的是带号和y值 三、思路 3.1、mapbox获取经纬度方法 初始化地图后.on方法中有个mousemove方法 mapboxUtil._m…