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 初始化时,设置的地址来
相关推荐
Jay_5158 分钟前
C语言环形数组(循环队列)详解:原理、实现与应用
c语言·学习·嵌入式·环形数组
Jay Kay9 分钟前
TensorFlow Serving学习笔记2: 模型服务
学习·tensorflow
梦境虽美,却不长1 小时前
数据结构 学习 队列 2025年6月14日 11点22分
数据结构·学习·队列
虚妄狼1 小时前
【Docker Desktop】Windows11安装 Docker Desktop
运维·docker·容器
幻灭行度1 小时前
CKA考试知识点分享(16)---cri-dockerd
kubernetes
GISDance2 小时前
2025年高考志愿填报指导资料
学习·考研·高考
西西小飞龙3 小时前
Docker 基础使用
docker·容器·eureka
weixin_464078073 小时前
Python学习小结
python·学习
再ZzZ4 小时前
Docker安装PaddleOCR并提供接口服务(CPU)
运维·docker·容器
IguoChan6 小时前
8. Redis Operator (1) —— 单机部署
kubernetes