k8s的开篇学习和安装

k8s的开篇学习

学习网站

参考资料

1。 K8S能干什么

[概述 | Kubernetes](https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do)需要开代理

2。docker资料

复制代码
https://docs.docker.com/get-started/

3.prometheus资料

复制代码
https://prometheus.io/docs/introduction/overview/

开篇前言

不能站在上帝视角,一开始就大而全的去理解k8s所有组件,对于新人入门是灾难。

前期,抓住重点,学会安装,应用部署,不断加入新组件,理解该组件能解决什么问题。

才是循序渐进的学习方法

当然,在课余时间,为了掌握这一类重量级的技术,必须得看资料,理解为什么k8s提供那么多组件,以及作用.

为什么要学习k8s

1.1 iptables规则,为了理解防火墙作用、以及实现对数据包的转发,修改作用,源ip:port 目标ip:port 协议等。

1.2 虚拟化kvm

1.3 容器技术,容器,镜像,仓库,网络

1.4 从单个的容器管理命令,升级为yaml形式的资源描述文件,以及提供了相应的编排能力,运行、管理一组多个容器

以及容器之间会共同使用到的,如桥接网络网段,如创建的数据卷Volume,也可以在多个容器之间共享数据。

1.5 问题又来了,你这只是在单机的如docker-200机器上操作一堆容器,容器需要部署在多个机器上呢?

你后端需要运行的一组如4个容器,不能只在一个宿主机上跑吧,那不还是公用的单一的宿主机配置吗?

1.6 因此容器需要跨主机部署,以及配置跨主机的容器通信方案

1.7 以及容器运行在了多个机器上,容器就是你后端么,如何确保对容器的资源使用率监控?容器内服务监控?

是不是也得手工去维护docker?

  1. 如上诸多问题,在容器规模上来,跨机器的部署,就推进了容器编排技术必须要继续发展,开发出强大的编排工具
    解决上述的问题,以及更多的问题。这就是 k8s为什么出现了。
    运维的方式就彻底颠覆了,容器多机器编排的工具,必须得有开发代码的编写方式,也彻底的颠覆了系统,都是分开发的,多个小组件运行一个一个容器里

这个就叫做微服务

也就是技术就是一步一步演化而来。

k8s软件介绍

  • 纯docker的运行模式,是docker主机单独的去管理一堆的容器应用,但发现数量多了以后,配置复杂,就难以管理多个容器,并且跨主机下的容器集群,更是维护复杂。
    • 业务数量庞大,那些容器部署在那些节点使用了那些的端口,如何记录,管理,需要登陆到每一台机器去管理。
    • 跨主机的通信,多个机器中的容器之间相互调用如何做,IP tables规则手动维护,
    • 跨主机容器的调用,配置如何写,ip和端口
    • 如何实现业务的高可用性,多个容器对外提供服务如何实现负载均衡。
    • 如何实现滚动升级业务的连续性。

k8s的介绍

  • Kuberneter 也被称为k8s,是用于自动化的部署,扩缩和管理容器应用化程序的开源系统。

  • 他将组成的应用系统组合成逻辑单元,以便于管理和服务发现

  • Kubernets 来源于Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

  • Google每周运行10亿个容器,kubernets基于相同的设计原理,能够在不扩张运维团队的前提下,进行规模性的管理。

  • 从官方的资料来看,就已经解决了容器化的管理问题。

为什么会出现k8s

部署时代架构

v1 物理机

v2 虚拟化,vmware 商业版为代表,出现开源版的 openstack

v3 容器化部署,容器化大规模应用后,难以维护,出现了

k8s技术

k8s 是一个平台框架

  • k8s提供了很多功能,简化了对容器的部署管理
    • 基于容器对应用的发布管理,更新,升级,降级。
    • 负载均衡,服务发现。
    • 跨机器,跨地区的网络管理模式
    • 自动扩缩容器功能
    • 针对nginx无状态服务运行模式,如mysql等有状态的运行组件
    • 支持丰富的插件。
  • k8s并不是包罗万象,它本身只有自己的组件,而其他的功能,如消息列队,数据库,存储都需要安装在K8S上

k8s的本质是一个大而全的一个平台,组件很多,提供了很多的功能组件,目的是为了更好的管理容器。

  • 所以K8S的组件是专门用来保障,应用的发布的高可用性弹性扩缩
  • 升级降级的一个重要的组件,
  • 还有专门用来维护,网络,存储,等K8S的其他组件
  • 因此学习的路线是1.先学会应用的部署,无状态的应用,2.学习其他的组件,部署容器

k8s核心架构

如何设计一个容器管理平台

  • 集群架构,管理节点分发到数据节点
  • 如何部署业务容器到各个数据节点
  • N个数据节点,业务容器如何选择部署到合理的节点
  • 容器如何实现多副本,如何满足每个机器都部署一个容器模型
  • 多副本如何实现负载均衡

分布式系统分为二种角色:管理节点和工作节点

从系统架构来看,k8s分为2个节点

master 控制节点,包工头

node 工作节点 工人

复制代码
提供啦很多组件,方便你去各个角度更好的维护,管理容器
1. 容器的高可用性,数量的保障,版本的升级
2, 容器之间的网络关系
3, 容器之间的数据共享关系
4, 容器内的配置文件\
...........
都是K8S提供的各个组件

k8s组件通信架构图

  1. k8s集群,至少需要2台ecs机器
  2. k8s的本身,也是以容器运行
  • k8s集群是被一组被称为Node的节点组成的,这些节点运行K8S管理进程的容器
  • 具体的Node节点机器上运行的容器被叫做pod的组件管理
  • 安装完k8s后,就得到啦一个集群的环境
    • 集群指的是有一堆Node节点的机器,并且这些节点运行pod,也就是容器了。

理解k8s核心几块资源

k8s默认的组件很多,每一个pod控制器(工作负载),以及网络插件组件,没法一个个的去读,前期也都被封装在了底层,也关心不到。

因此,只聊我们能用到的几个组件,如pod创建,需要用到几个组件,需要背一背,以及查看对应的资源,再机器上的容器进程信息。

后续不断的加入新知识,再去理解对应的组件

即可循序渐进的理解,k8s的复杂知识。

当然,建议也是,平日里,看k8s官网文档,以及如k8s权威指南 v5版本的书籍,去阅读理论知识,扩充自己的理论知识,更合适。

v1-v5

上课,为了更快速的,理解,操作,k8s组件该如何玩

  1. 快速学会玩法
  2. 再去看资料理解本质原理

node概念

ECS机器,k8s运行的一个环境。

pod等资源,属于k8s安装好后的,集群内的一个资源信息。

1.k8s工作节点,node,运行环境可以是::::vmware创建的一个虚拟机 ,k8s-node-11 k8s-node-12

2.node上具体运行啥?运行容器,k8s部署的应用,都是跑再容器里,还得装docker

  1. 初始化,运行工作节点,或者主节点,背后逻辑就是
    1. 下载k8s自身的一些组件的镜像
    2. 运行镜像,创建对应的容器,到对应的目标机器上(k8s-master、k8s-node)

k8s-node的部署逻辑图

复制代码
1. pod的IP是随着变化的,删除pod,ip变化
2. pod内都有一个根容器
4. 一个pod内可以有一个、多个容器
5.一个pod内的所有容器,共享根容器的网络名称空间,文件系统,进程资源
6.一个pod内的容器网络地址,由根容器提供。

k8s集群安装部署

带着理论,再去部署,验证你的理论

  • 准备3台机器,注意配置,别太低,否则跑不起来。

  • 系统初始化配置,如ntp等

    主机名、节点ip、部署组件

    k8s kubeadm 一键自动化,安装k8s集群,安装所有运行需要的组件

    k8s-master 10.0.0.10 etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm, kubelet, kube-proxy, flannel

    k8s-node1 10.0.0.11 kubectl, kubelet, kube-proxy, flannel,docker

    k8s-node2 10.0.0.12 kubectl, kubelet, kube-proxy, flannel,docker

    确保三台机器,的跨节点的容器互相通信,装网络插件flannel

环境初始化

复制代码
cat  >>/etc/hosts <<'EOF'
10.0.0.10 k8s-master-10 
10.0.0.11 k8s-node-11
10.0.0.12 k8s-node-12
EOF

ping -c 2 k8s-master-10
ping -c 2 k8s-node-11
ping -c 2 k8s-node-12

防火墙初始化

复制代码
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManager

sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld && systemctl stop firewalld


getenforce 0

iptables -F
iptables -X
iptables -Z

iptables -P FORWARD ACCEPT

关闭swap

k8s默认禁用swap功能

复制代码
swapoff -a
# 防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

yum源配置

复制代码
curl  -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl  -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/*.repo

yum clean all && yum makecache fast

ntp配置

复制代码
yum install chrony -y

systemctl start chronyd
systemctl enable chronyd

date



# 修改配置文件,加入ntp.aliyun.com上游地址即可

ntpdate -u ntp.aliyun.com



hwclock -w

修改linux内核参数,开启数据包转发功能

复制代码
# 容器夸主机通通信,底层是走的iptables,内核级别的数据包转发

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF


modprobe br_netfilter
# 加载读取内核参数配置文件
sysctl -p /etc/sysctl.d/k8s.conf

安装docker基础环境()

复制代码
yum remove docker docker-common docker-selinux docker-engine -y 

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

yum list docker-ce --showduplicates

yum install docker-ce-19.03.15 docker-ce-cli-19.03.15 -y

#配置docker加速器、以及crgoup驱动,改为k8s官方推荐的systemd,否则初始化时会有报错。

mkdir -p /etc/docker
# 这里使用的是你自己的华为云的镜像id,不要使用我的这个容器加速镜像
cat > /etc/docker/daemon.json <<'EOF'
{
    "registry-mirrors": [ "https://58698f75ac8e4e98bbb253a7e9b31657.mirror.swr.myhuaweicloud.com" ]
}
EOF

#启动
systemctl start docker && systemctl enable docker

docker version

安装k8s的初始化

复制代码
[root@k8s-master-10 ~]#cat init-k8s.sh 
#设置阿里云源

curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


cat <<EOF > /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
EOF


yum clean all && yum makecache


#yum list kubeadm --showduplicates   列出,这个阿里云k8s源,提供了哪些k8s版本让你玩
# 这个脚本看懂1111


# 安装指定版本 kubeadm-1.19.3   ,安装的kubeadm版本,就是决定了,拉去什么版本的k8s集群版本的镜像

yum install kubelet-1.19.3 kubeadm-1.19.3   kubectl-1.19.3 ipvsadm -y

初始化k8s-master主节点(只在主节点执行)

复制代码
# kubeadm init   初始化,加入一些参数

#
kubeadm init \
--apiserver-advertise-address=10.0.0.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU



kubeadm init \
--apiserver-advertise-address=10.0.0.10 \   # api-server运行再k8s-master的ip上
--image-repository registry.aliyuncs.com/google_containers \ # 拉去k8s镜像,从阿里云上获取,否则默认是国外的k8s镜像地址,下载不了
--kubernetes-version v1.19.3 \  # 和kubeadm保持一直
--service-cidr=10.1.0.0/16 \    #  k8s服务发现网段设置,service网段
--pod-network-cidr=10.2.0.0/16 \   # 设置pod创建后,的运行网段地址
--service-dns-domain=cluster.local \ #  k8s服务发现网段设置,service资源的域名后缀
--ignore-preflight-errors=Swap \  # 忽略swap报错
--ignore-preflight-errors=NumCPU  #  忽略cpu数量报错

中间的组件创建过程,以及ssl证书创建过程,暂时不用看,以后回国头再看


# k8s-master成功装好了

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
# 创建k8s集群配置文件
# 制定了,默认的ssl整数在哪,api-server的地址,等
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  
  
  
  ======================-===============
# pod分布再多个机器上,pod互相之间链接,得部署,集群网络,选用flannel网络插件
# 安装,使用即可。


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/



# 使用如下命令,将k8s-node加入集群即可,
Then you can join any number of worker nodes by running the following on each as root:
===================================================

# join添加到集群中

    ====================================
[root@k8s-master-10 ~]#


# k8s-master初始化结果,讲解,听懂6666


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

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/

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

kubeadm join 10.0.0.10:6443 --token gwv20l.vjex2uud3ng450ig \
    --discovery-token-ca-cert-hash sha256:fce52138a94d585d07015dbf718e39b5ba3c7988021c5ef98bf8af6c5be191dd 
[root@k8s-master ~]# 


#添加这个join

此时主节点就可以用

查看 k8s集群状态,查看有哪些工作节点

复制代码
客户端命令
# 可以直接和api-server交互,查询 你要的信息 

# 这个命令,默认会去加载ssl证书,确保安全
# 以后再聊,kubectl的整数添加参数
# 再主节点上,使用这个命令是可以直接用的



kubectl   get  nodes  

# 显示更详细的信息

kubectl   get  nodes  -owide

## 查看kubeadm 版本,初始化的k8s版本信息,就是 v1.19.3版本

$ kubeadm version


[root@k8s-master-10 ~]#kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:47:53Z", Go



## 设置kubelet开机启动
systemctl enable kubelet
systemctl enable docker

如何让集群就绪呢?部署网络插件

复制代码
# 1. 下载网络插件的,配置文件 ,yaml以及配置文件
git clone --depth 1 https://github.com/coreos/flannel.git

# 2.再k8s主节点上,应用这个yaml,基于yaml,创建具体的pod过程。

# 3.如果需要修改pod运行网络的话,要改配置文件,
/root/flannel-master/Documentation/kube-flannel.yml

# 创建k8s资源,都是写这种yml文件了

[root@k8s-master-10 ~/flannel-master/Documentation]#grep 'Network' -A 5 kube-flannel.yml 
      "Network": "10.2.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---


# 修改的第二处,夸主机的容器通信,最终不得走宿主机的物理网卡。
# 告诉flannel的你物理网卡是谁
      containers:
      - name: kube-flannel
       #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=ens33

# 基于kubectl命令,应用这个yml文件,读取,以及创建pod资源

[root@k8s-master-10 ~/flannel-master/Documentation]#kubectl create -f ./kube-flannel.yml 
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created



# 查看当前机器的容器,关于flannel网络插件的进程
[root@k8s-master-10 ~/flannel-master/Documentation]#docker ps |grep flannel
812ebf6b0578        registry.aliyuncs.com/google_containers/pause:3.2   "/pause"                 31 seconds ago      Up 31 seconds                           k8s_POD_kube-flannel-ds-9x4l2_kube-flannel_37b34022-cc0d-47c3-b677-3fe657374dbc_0





修改pod网络的网段地址,根据kubeadm init 初始化时,设置的地址来
相关推荐
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT5 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa5 小时前
HTML和CSS学习
前端·css·学习·html
Ribou6 小时前
Ubuntu 24.04.2安装k8s 1.33.4 配置cilium
linux·ubuntu·kubernetes
看海天一色听风起雨落6 小时前
Python学习之装饰器
开发语言·python·学习
speop7 小时前
llm的一点学习笔记
笔记·学习
非凡ghost7 小时前
FxSound:提升音频体验,让音乐更动听
前端·学习·音视频·生活·软件需求
Mr. Cao code7 小时前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器