当前位置:   article > 正文

K8S_compose-组件-环境部署_docker compose k8s

docker compose k8s

容器运行时:docker、containerd、rkt、coreOS
oci容器规范

之前学习的容器编排工具:compose—》使用prometheus去监控容器—》prometheus+cadvisor+redis
compose在启动容器使用yml文件(docker-compose.yml)—》ansible里的playbook。
  • 1
  • 2
  • 3
  • 4
  • 5

概念

Kubernetes,也称为K8s,是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。
它将组成应用程序的容器分组成逻辑单元,以便于管理和发现。
Kubernetes建立在谷歌运行生产工作负载的15年经验之上,并结合了来自社区的最佳想法和实践。

k8是将google内部的容器编排工具borg,使用go语言重写,然后开源的

k8s——Production-Grade Container Orchestration——生产级别的容器编排工具
k3s——轻量级的kubernetes

compose和k8s区别?

1、compose是docker推出的(swarm也是,级别同k8s),k8s是CNCF推出的
2、compose只能在一 台宿主机上编排容器,而k8s可以在很多台机器上编排容器

k8s出生名门(google),15年的生产使用经验,稳定性和扩展性等方面有保障的,所以和swarm相比胜出了
go语言方向:运维开发、云原生、区块链
  • 1
  • 2

在这里插入图片描述

k8s组件

https://kubernetes.io/zh/docs/concepts/overview/components/
在这里插入图片描述

控制平面组件(Control Plane Components)

控制平面组件 :实现k8s控制功能的软件,控制软件相当于管理层,对整个集群进行调度,管理、控制、数据存储等,集群的全盘信息。

  • kube-apiserver:API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。其他的node服务器或者master访问的入口,可以通过API 获取整个集群的信息

  • etcd: 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。–》etcd就是一个数据库

  • kube-scheduler:调度器,调度哪些pod到具体的哪些节点上运行。
    控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。 --》调度哪些pod到具有的哪些节点上运行

  • cloud-controller-manager:云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。
    云控制器管理器使得你可以将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。
    可以和aws,阿里云,华为云,google云等通信的,在管理这些云上的资源

  • kube-controller-manager:运行控制器进程的控制平面组件;
    从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

    1.节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
	2.任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
	3.端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
	4.服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
更加细致的控制器: 监控资源,管理资源的软件
Deployments: 部署控制器,在node节点上去部署pod的,监控node节点是否将pod安装好
ReplicaSet:  副本控制器,监控整个集群里pod数量的总数
StatefulSets
DaemonSet
Jobs
已完成 Job 的自动清理
CronJob
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Node组件

kubulet :一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。负责调本机的docker或者containerd容器运行时软件去启动pod。
kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes 服务(Service) 概念的一部分。

容器和pod是什么关系?

  • Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
  • 一个pod里面可以有多个容器

一个Kubernetes集群包含俩种类型的资源

  • Master:调度整个集群——运行执行管理功能的pod的运行的地方——党中央
  • Nodes:负责运行应用 —》worker 真正的container app运行在node节点服务器上 --》运行业务pod的地方
    Node 使用 Master 暴露的 Kubernetes API 与 Master 通信。

部署k8s的集群环境

安装方式

1.二进制安装: 脚本一键安装  
2.kubeadm工具:自动安装
	Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群
	部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
3、minikube
	 Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用
	 部署地址:https://kubernetes.io/docs/setup/minikube/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

kubeadm方式安装步骤

1.环境准备

# 重新命名主机,在所有主机上上添加如下命令,修改hosts文件
cat >> /etc/hosts << EOF 
	192.168.2.130 master
	192.168.2.150 node1
	192.168.2.110 node2
	192.168.2.112 node3
	EOF
# 临时修改主机名
	hostnamectl set-hostname master
	hostnamectl set-hostname node1
	hostnamectl set-hostname node2
	hostnamectl set-hostname node3
	su  - root
[root@master ~]# cat /etc/centos-release  # 查看Linux版本
CentOS Linux release 7.9.2009 (Core)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
# 建议先给每台服务器起好名字,使用固定的ip地址,防止后面因为ip地址的变化,导致整个集群异常
[root@master network-scripts]# cat ifcfg-ens33
BOOTPROTO="none"
NAME="ens33"
UUID="b5015930-2bb4-4f5b-b48d-12387d55a32e"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.169.154
PREFIX=24
GATEWAY=192.168.169.2
DNS1=114.114.114.114
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.确认docker已经安装好,启动docker,并且设置开机启动

[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
[root@master ~]# ps aux|grep docker
root      2190  1.4  1.5 1159376 59744 ?       Ssl  16:22   0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      2387  0.0  0.0 112824   984 pts/0    S+   16:22   0:00 grep --color=auto docker
  • 1
  • 2
  • 3
  • 4
  • 5

3.配置 Docker使用systemd作为默认Cgroup驱动

每台服务器上都要操作,master和node上都要操作

cat <<EOF > /etc/docker/daemon.json
{
	"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

#重启docker
systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. 关闭swap分区

因为k8s不想使用swap分区来存储数据,使用swap会降低性能
每台服务器都需要操作

swapoff -a # 临时关闭
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久关闭
  • 1
  • 2

5.修改内核参数

每台机器上(master和node),永久修改

[root@node3 ~]#cat <<EOF >>  /etc/sysctl.conf  追加到内核会读取的参数文件里
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
[root@node3 ~]#sysctl -p  让内核重新读取数据,加载生效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6.安装kubeadm,kubelet和kubectl

集群里的每台服务器都需要安装

kubeadm --》k8s的管理程序–》在master上运行的–》建立整个k8s集群,背后是执行了大量的脚本,帮助我们去启动k8s

kubelet --》在node节点上用来管理容器的–》管理docker,告诉docker程序去启动容器
master和node通信用的–》管理docker,告诉docker程序去启动容器 一个在集群中每个节点(node)上运行的代理。
它保证容器(containers)都 运行在 Pod 中。

kubectl --》在master上用来给node节点发号施令的程序,用来控制node节点的,告诉它们做什么事情的,是命令行操作的工具

    # 添加kubernetes 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
	yum install -y kubelet kubeadm kubectl
	# 设置开机自启,因为kubelet是k8s在node节点上的代理,必须开机要运行的
	systemctl enable  kubelet

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

7.部署Kubernetes Master

master主机执行

#提前准备coredns:1.8.4的镜像,后面需要使用,需要在每台机器上下载镜像
	[root@master ~]# docker pull  coredns/coredns:1.8.4
	[root@master ~]# docker pull  coredns/coredns

	[root@master ~]# docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4

#初始化操作在master服务器上执行
	[root@master ~]#kubeadm init \
	--apiserver-advertise-address=192.168.2.130 \  # 填写master的ip
	--image-repository registry.aliyuncs.com/google_containers \
	--service-cidr=10.1.0.0/16 \
	--pod-network-cidr=10.244.0.0/16
	#192.168.0.17 是master的ip
	# --service-cidr string                  Use alternative range of IP address for service VIPs. (default "10.96.0.0/12")  服务发布暴露--》dnat
	# --pod-network-cidr string              Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

初始化成功后的结果

[addons] Applied essential addon: kube-proxy

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/

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

kubeadm join 192.168.2.130:6443 --token 2fiwt1.47ss9cjmyaztw58b \
--discovery-token-ca-cert-hash sha256:653c7264622a6935f9b3ec5509570dc288e52143aeb78b139ca3eddf10f2cdf8 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

按照提示操作

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  或
  export KUBECONFIG=/etc/kubernetes/admin.conf
  • 1
  • 2
  • 3
  • 4
  • 5

8. node节点服务器加入k8s集群

在所有node节点执行
测试node1节点是否能和master通信

[root@node1 ~]# ping master
PING master (192.168.2.130) 56(84) bytes of data.
64 bytes from master (192.168.2.130): icmp_seq=1 ttl=64 time=1.63 ms
64 bytes from master (192.168.2.130): icmp_seq=2 ttl=64 time=0.701 ms
  • 1
  • 2
  • 3
  • 4

在每台节点上执行一下命令

[root@node1 ~]# kubeadm join 192.168.2.130:6443 --token 2fiwt1.47ss9cjmyaztw58b --discovery-token-ca-cert-hash sha256:653c7264622a6935f9b3ec5509570dc288e52143aeb78b139ca3eddf10f2cdf8 
  • 1

查看master节点上的所有的节点服务器

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
master   NotReady   control-plane,master   35m     v1.23.5
node1    NotReady   <none>                 5m54s   v1.23.5
node2    NotReady   <none>                 36s     v1.23.5
node3    NotReady   <none>                 29s     v1.23.5
# NotReady 说明master和node节点之间的通信还是有问题的,容器之间通信还没有准备好
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#k8s里删除节点k8s-node1
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets node/node1 
kubectl delete node node1
  • 1
  • 2
  • 3

9.安装网络插件flannel(在master节点执行)

实现master上的pod和node节点上的pod之间通信
kube-flannel.yaml 文件需要自己去创建,此处省略。

# 部署flannel
[root@master feng]# kubectl apply -f kube-flannel.yml 
[root@master feng]# ps aux|grep flannel
root     10346  0.7  0.7 1339640 29440 ?       Ssl  17:48   0:01 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
root     11134  0.0  0.0 112824   988 pts/0    S+   17:50   0:00 grep --color=auto flannel
[root@master feng]# docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED          STATUS          PORTS     NAMES
10d7d44e2758   dee1cac4dd20                                        "/opt/bin/flanneld -…"   2 minutes ago    Up 2 minutes              k8s_kube-flannel_kube-flannel-ds-5ckpg_kube-system_c02e887a-43de-462e-9b2e-d918dead4dbc_0
449988af9f29   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 3 minutes ago    Up 2 minutes              k8s_POD_kube-flannel-ds-5ckpg_kube-system_c02e887a-43de-462e-9b2e-d918dead4dbc_0
cd1e79159f89   3c53fa8541f9                                        "/usr/local/bin/kube
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

10.查看集群状态

[root@master feng]# kubectl get nodes # 获取node信息
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   52m   v1.23.5
node1    Ready    <none>                 22m   v1.23.5
node2    Ready    <none>                 17m   v1.23.5
node3    Ready    <none>                 17m   v1.23.5
[root@master feng]# kubectl get nodes -n kube-system -o wide # 查看各个节点详细信息
NAME     STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
master   Ready    control-plane,master   55m   v1.23.5   192.168.2.130   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.14
node1    Ready    <none>                 25m   v1.23.5   192.168.2.150   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.14
node2    Ready    <none>                 20m   v1.23.5   192.168.2.110   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.14
node3    Ready    <none>                 20m   v1.23.5   192.168.2.112   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://20.10.14
[root@master feng]# kubectl get pod -n  kube-system  # 看kube-system命名空间里的pod
[root@master feng]# kubectl  get pod -n kube-system -o wide
[root@master feng]# kubectl get ns  # 查看k8s里的命名空间有哪些--》k8s自己创建的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

中途报错解决:k8s的 coredns 的ImagePullBackOff 和ErrImagePull 问题解决

创建控制器

[root@master ~]# kubectl create deployment k8s-nginx  --image=nginx  -r 8
deployment.apps/k8s-nginx created

# kubectl create deployment 创建部署控制器
# k8s-nginx   是控制器的名字
# --image=nginx   指定控制器去启动pod使用的镜像
# -r 8 启动8个nginx的pod
# -r, --replicas=1: Number of replicas to create. Default is 1.


[root@master ~]# kubectl get deploy
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
k8s-nginx   8/8     8            8           65s
[root@master ~]# kubectl get pod
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl get rs
NAME                   DESIRED   CURRENT   READY   AGE
k8s-nginx-6d779d947c   8         8         5       34m
# pod扩容
[root@master ~]# kubectl scale deployment/k8s-nginx --replicas  16
deployment.apps/k8s-nginx scaled
# pod缩减
[root@master ~]# kubectl scale deployment/k8s-nginx --replicas  6
deployment.apps/k8s-nginx scaled
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
sudo ifconfig cni0 down    
sudo ip link delete cni0
  • 1
  • 2
#进入pid里面的nginx容器
[root@master ~]# kubectl exec  k8s-nginx-6d779d947c-8zp76  -it -- /bin/bash 
root@k8s-nginx-6d779d947c-8zp76:/# 
root@k8s-nginx-6d779d947c-8zp76:/# 
root@k8s-nginx-6d779d947c-8zp76:/# cat /etc/issue
Debian GNU/Linux 11 \n \l

# 删除控制器
[root@master ~]# kubectl delete deployment k8s-nginx
deployment.apps "k8s-nginx" deleted
# 查看pod相关的详细信息(以yml、json格式)
[root@master liyingchao]# kubectl get pod memory-demo --output=json --namespace=mem-example
[root@master liyingchao]# kubectl get pod memory-demo --output=yaml --namespace=mem-example
[root@master liyingchao]# kubectl top pod memory-demo --namespace=mem-example
error: Metrics API not available
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/157053
推荐阅读
相关标签
  

闽ICP备14008679号