赞
踩
容器运行时:docker、containerd、rkt、coreOS
oci容器规范
之前学习的容器编排工具:compose—》使用prometheus去监控容器—》prometheus+cadvisor+redis
compose在启动容器使用yml文件(docker-compose.yml)—》ansible里的playbook。
Kubernetes,也称为K8s,是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。
它将组成应用程序的容器分组成逻辑单元,以便于管理和发现。
Kubernetes建立在谷歌运行生产工作负载的15年经验之上,并结合了来自社区的最佳想法和实践。k8是将google内部的容器编排工具borg,使用go语言重写,然后开源的
k8s——Production-Grade Container Orchestration——生产级别的容器编排工具
k3s——轻量级的kubernetes
1、compose是docker推出的(swarm也是,级别同k8s),k8s是CNCF推出的
2、compose只能在一 台宿主机上编排容器,而k8s可以在很多台机器上编排容器
k8s出生名门(google),15年的生产使用经验,稳定性和扩展性等方面有保障的,所以和swarm相比胜出了
go语言方向:运维开发、云原生、区块链
https://kubernetes.io/zh/docs/concepts/overview/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
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 通信。
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/
# 重新命名主机,在所有主机上上添加如下命令,修改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)
# 建议先给每台服务器起好名字,使用固定的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
[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
每台服务器上都要操作,master和node上都要操作
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker
因为k8s不想使用swap分区来存储数据,使用swap会降低性能
每台服务器都需要操作
swapoff -a # 临时关闭
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久关闭
每台机器上(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 让内核重新读取数据,加载生效
集群里的每台服务器都需要安装
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
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.
初始化成功后的结果
[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
按照提示操作
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
在所有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
在每台节点上执行一下命令
[root@node1 ~]# kubeadm join 192.168.2.130:6443 --token 2fiwt1.47ss9cjmyaztw58b --discovery-token-ca-cert-hash sha256:653c7264622a6935f9b3ec5509570dc288e52143aeb78b139ca3eddf10f2cdf8
查看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节点之间的通信还是有问题的,容器之间通信还没有准备好
#k8s里删除节点k8s-node1
kubectl drain node1 --delete-emptydir-data --force --ignore-daemonsets node/node1
kubectl delete node node1
实现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
[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自己创建的
中途报错解决: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
sudo ifconfig cni0 down
sudo ip link delete cni0
#进入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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。