IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Kubernetes 安装集群与部署应用 -> 正文阅读

[系统运维]Kubernetes 安装集群与部署应用

学习视频:Kubernetes (K8S) 3 小时快速上手 + 实践,无废话纯干货
参考文档:https://k8s.easydoc.net/

内容介绍:

  • 什么是 kubernetes,什么时候需要 kubernetes,以及它的组成架构。
  • 用 3 种不同的方式教安装 kubernetes 集群。包括minikube,云平台搭建,裸机搭建(3 台服务器)。
  • 通过一个 demo 项目演示如何部署项目到集群中,怎么对外暴露服务端口。
  • 怎么部署数据库这种有状态的应用,以及如何数据持久化。
  • 集群中配置文件和密码文件的使用。
  • 怎么使用 Helm 应用商店快速安装第三方应用。
  • 怎么使用 Ingress 对外提供服务。

目标:学完课程,对 kubernates 有一个全面的认识,能够轻松应对各种集群部署工作。

Kubenetes 简介

官方文档(中文):Kubernetes

Kubernetes (K8S) 是什么

K8S 是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。

Kubernetes 这个名字源于希腊语,意为 “舵手” 或 “飞行员”。

K8S 这个缩写是因为 k 和 s 之间有 8 个字符的关系。

Google 在 2014 年开源了 Kubernetes 项目

主要特性:

  • 高可用,不宕机,自动灾难恢复。
  • 灰度更新,不影响业务正常运转。
  • 一键回滚到历史版本。
  • 方便的伸缩扩展(应用伸缩,机器加减)、提供负载均衡。
  • 完善的生态。

不同的部署方案

请添加图片描述

传统部署方式

应用直接在物理机上部署,机器资源分配不好控制,出现 Bug 时,可能机器的大部分资源被某个应用占用,导致其他应用无法正常运行,无法做到应用隔离。

虚拟机部署

在单个物理机上运行多个虚拟机,每个虚拟机都是完整独立的系统,性能损耗大。

容器部署

所有容器共享主机的系统,轻量级的虚拟机,性能损耗小,资源隔离,CPU 和内存可按需分配。

什么时候需要 K8S

当应用只需要跑在 1 台机器,直接 docker + docker-compose 就够了,方便轻松。

当应用需要跑在 3,4 台机器上,依旧可以每台机器单独配置运行环境 + 负载均衡器。

当应用访问数不断增加,机器逐渐增加到十几台、上百台、上千台时… 每次加机器、软件更新、版本回滚,都会变得非常麻烦、痛不欲生,,人生浪费在那些没技术含量的重复性工作上。这时候,Kubernetes 就可以一展身手了,让你轻松管理百万千万台机器的集群。

Kubernates 可以提供集中式的管理集群机器和应用,加机器、版本升级、版本回滚,都是一个命令就搞定的事。

它还有很多功能:不停机的灰度更新,确保高可用、高性能、高扩展 …

K8S 集群架构

master:主节点,控制平台,不需要很高性能,不跑任务。

通常一个就行,也可以开多个主节点来提高集群可用度。

worker:工作节点,可以是虚拟机或物理计算机,任务都在这里跑,机器性能需要好点。

通常都有很多个,可以不断加机器扩大集群;每个工作节点由主节点管理。

Pod(重要概念):K8S 调度、管理的最小单位。

一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟 IP。

一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。

Kubernetes 组件

  • kube-apiserver: API 服务器,公开了 Kubernetes API
  • etcd:键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库
  • kube-scheduler:调度 Pod 到哪个节点运行
  • kube-controller:集群控制器
  • cloud-controller:与云服务商交互

想要了解更多 K8S 组成细节,主节点、工作节点分别有哪些程序,有什么作用,可以查看 官网详细介绍

安装 K8S 集群

安装方式介绍:

  • minikube
    只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。
  • 使用云平台 Kubernetes
    可视化搭建,只需简单几步就可以创建好一个集群。
    优点:安装简单,生态齐全,负载均衡器、存储等都给配套好,简单操作就搞定。
  • 裸机安装(Bare Metal)
    至少需要两台机器(主节点、工作节点个一台),需要自己安装 Kubernetes 组件,配置会稍微麻烦点。
    可以到各云厂商按时租用服务器,费用低,用完就销毁。
    缺点:配置麻烦,缺少生态支持,例如负载均衡器、云存储。

minikube

注:需要提前安装好 Docker

安装非常简单,支持各种平台,参考官方文档:安装方法

# 启动集群
minikube start
# 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具
kubectl get node
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 安装集群可视化 Web UI 控制台
minikube dashboard

云平台搭建

1、腾讯云容器服务(Tencent Kubernetes Engine ,TKE)

  • 快速创建入门集群


2、容器服务ACK_容器服务Kubernetes版_容器_云原生应用平台-阿里云 (aliyun.com)

操作步骤与腾讯云差不多…

裸机搭建(Bare Metal)

主节点需要组件:

  • docker(也可以是其他容器运行时)
  • kubectl 集群命令行交互工具
  • kubeadm 集群初始化工具

工作节点需要组件:文档

  • docker(也可以是其他容器运行时)
  • kubelet 管理 Pod 和容器,确保他们健康稳定运行。
  • kube-proxy 网络代理,负责网络相关的工作

购买服务器

腾讯云,云服务器,新建 3 台服务器,来实现裸机搭建。

  1. 选择机型

  1. 设置主机
  2. 确认配置

成功新建 3 个实例。

开始搭建

可以试下 这个项目,用脚本快速搭建 K8S 裸机集群
当然,为了更好的理解,你应该先手动搭建一次

每个节点分别设置对应主机名:

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

修改 hosts (复制的是腾讯云内网ip)(所有节点)

vim /etc/hosts

10.206.0.14 master
10.206.0.3 node1
10.206.0.5 node2

# 修改完成后可以互相 ping 一下
# ping node1
# 所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

确保防火墙关闭(所有节点)

systemctl stop firewalld
systemctl disable firewalld

添加安装源(所有节点)

# 添加 k8s 安装源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/

# 添加 Docker 安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装所需组件(所有节点)

yum install -y kubelet kubeadm kubectl docker-ce

启动 kubelet、docker,并设置开机启动(所有节点)

systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker

修改 docker 配置(所有节点)

# kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
cat <<EOF > daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/

# 重启生效
systemctl daemon-reload
systemctl restart docker

kubeadm 初始化集群(仅在主节点跑

注意下面第一行运行结束后得到的代码,等等要放到工作节点运行(注意去掉换行符)

kubeadm join xxxx:6443 --token xxx --discovery-token-ca-cert-hash xxx
# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
##### 记录这时候运行得到的代码,等等要放到工作节点运行
##### kubeadm join xxxx:6443 --token xxx --discovery-token-ca-cert-hash xxx

# 记得把 kubeadm join xxx 保存起来
# 忘记了重新获取:kubeadm token create --print-join-command

# 复制授权文件,以便 kubectl 可以有权限访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群

有兴趣了解 kubeadm init 具体做了什么的,可以 查看文档

把工作节点加入集群(只在工作节点跑),用上面运行得到的代码跑:

kubeadm join xxxx:6443 --token xxx --discovery-token-ca-cert-hash xxx

安装网络插件,否则 node 是 NotReady 状态(只在主节点跑

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看节点,要在主节点查看(其他节点有安装 kubectl 也可以查看)

kubectl get nodes

搭建成功!wooooooooooo!

部署应用到集群

部署应用 YAML 文件

根据镜像

命令行中,根据镜像运行起 1 个 pod:

kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1

使用以下指令查看运行中的 pod:kubectl get pod,参数 -o wide 显示更多信息

Pod

根据 .yaml 文件运行起 1 个 pod:(注意 kind: Pod

kubectl apply -f ./pod.yaml 
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  # 定义容器,可以多个
  containers:
    - name: test-k8s # 容器名字
      image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像

Deployment

根据 .yaml 文件运行起多个 pod:(注意 kind: Deployment

kubectl apply -f ./deployment.yaml 
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  # 部署名字
  name: test-k8s
spec:
  replicas: 2
  # 用来查找关联的 Pod,所有标签都匹配才行
  selector:
    matchLabels:
      app: test-k8s
  # 定义 Pod 相关数据
  template:
  	# 下面内容其实就是前面pod.yaml中的内容
    metadata:
      labels:
        app: test-k8s
    spec:
      # 定义容器,可以多个
      containers:
      - name: test-k8s # 容器名字,生成容器后会跟一串随机字符串
        image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像

Deployment 通过 label 关联 Pods:

部署应用演示

部署一个 nodejs web 应用,源码地址:Github

# 部署应用
kubectl apply -f app.yaml
# 查看 deployment
kubectl get deployment
# 查看 pod
kubectl get pod -o wide
# 查看 pod 详情
kubectl describe pod pod-name
# 查看 log
kubectl logs pod-name
# 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。
kubectl exec -it pod-name -- bash # 进入后 exit 退出
# 伸缩扩展副本
kubectl scale deployment test-k8s --replicas=5
# 把集群内端口映射到节点
kubectl port-forward pod-name 8090:8080
# 查看历史
kubectl rollout history deployment test-k8s
# 回到上个版本
kubectl rollout undo deployment test-k8s
# 回到指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
# 删除部署
kubectl delete deployment test-k8s

Pod 报错解决

如果运行 kubectl describe pod/pod-name 发现 Events 中有下面这个错误:

networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory

在每个节点创建文件 /run/flannel/subnet.env 写入以下内容即可解决:

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

更多命令

# 查看全部
kubectl get all
# 重新部署
kubectl rollout restart deployment test-k8s
# 命令修改镜像,--record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s
# 恢复
kubectl rollout resume deployment test-k8s
# 输出到文件
kubectl get deployment test-k8s -o yaml >> app2.yaml
# 删除全部资源
kubectl delete all --all

更多官网关于 Deployment 的介绍

将 Pod 指定到某个节点运行:nodeselector
限定 CPU、内存总量:文档

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

工作负载分类

参考文档:https://kubernetes.io/zh/docs/concepts/workloads/

  • Deployment
    适合无状态应用,所有 Pod 等价,可替代。
  • StatefulSet
    有状态的应用,适合数据库这种类型。
  • DaemonSet
    在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等。
  • Job & CronJob
    Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。

现存问题

  • 每次只能访问一个 Pod,没有负载均衡自动转发到不同 Pod。
  • 访问还需要端口转发。
  • Pod 重创后 IP 变了,名字也变了。
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:23:53  更:2022-02-04 11:24:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 8:34:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码