容器编排工具之Kubernetes -- k8s
一文熟知k8s里的常见知识点
·
一、容器与容器编排
1、容器技术的优势:
1.资源消耗少
2.启动速度快
3.扩展非常方便
4.管理非常方便
2、常见的容器编排工具
1.compose--》单台机器上编排容器
2.swarm--》多台机器上编排容器
3.k8s-》多台机器上编排容器,性能和功能比swarm更加好
二、负载均衡
1、负载均衡的作用
1.能够将大量的请求比较均匀的分散到后端,不会导致某台服务器访问量过大,某台服务器又没有访问量
2.高可用(对后端的服务器进行健康检测,如果后端那台服务器出现问题,就不会再将请求转发给它,从而避免用户访问不了服务器,起到一个容错的功能)
2、nginx实现负载均衡
nginx是一个web服务器,可用来实现http功能,但他也可以对http访问进行负载均衡
1.安装nginx
[root@load-balancer ~]# yum install nginx -y
[root@load-balancer ~]# nginx --启动nginx
查看你nginx服务是否启动
[root@load-balancer ~]# ps aux|grep nginx
root 1632 0.0 0.2 119152 2168 ? Ss 17:30 0:00 nginx: master process nginx
nginx 1633 0.0 1.0 151840 8060 ? S 17:30 0:00 nginx: worker process
root 1635 0.0 0.1 12348 1096 pts/0 R+ 17:30 0:00 grep --color=auto nginx
nginx监听的是哪一个端口
[root@load-balancer ~]# ss -anplut|grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1633,fd=9),("nginx",pid=1632,fd=9))
tcp LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=1633,fd=10),("nginx",pid=1632,fd=10))
2.配置nginx里的负载均衡功能
[root@load-balancer ~]# cd /etc/nginx/ 进入配置文件的命令
[root@load-balancer nginx]# ls
conf.d koi-utf scgi_params
default.d koi-win scgi_params.default
fastcgi.conf mime.types uwsgi_params
fastcgi.conf.default mime.types.default uwsgi_params.default
fastcgi_params nginx.conf win-utf
fastcgi_params.default nginx.conf.default
#修改nginx的配置文件
[root@load-balancer nginx]# vim nginx.conf
http{
#定义一个负载均衡器,名字叫scweb
upstream scweb {
server 192.168.243.135; #nginx代理的三台服务器
server 192.168.243.136;
server 192.168.243.137;
}
server {
listen 80 default_server;
server_name www.sc.com;
location / {
proxy_pass http://scweb; #调用负载均衡器
}
}
3.重启一下nginx服务
[root@load-balancer nginx]# service nginx restart
Redirecting to /bin/systemctl restart nginx.service
3、负载均衡的相关算法
1.轮询 roundrobin --》rr
2.加权轮询
3.ip_hash --》基于客户端的ip地址做负载均衡,相同的ip地址转发到同一个服务器
4.least-connected --》最小连接数
4、keepalived
4.1、keepalived两大功能
1.high-availability 高可用高可用性是通过VRRP实现的协议。VRRP是路由器故障转移的基础
2.loadbalancing --》负载均衡
4.2、脑裂:就是2台或者多台LB上都有vip地址
1.出现脑裂的原因:
1.防火墙阻止了keepalived的vrrp消息的通告
2.virtual_router_id 不一样的时候
2.出现脑裂现象的影响和危害:
1.如果是防火墙原因导致脑裂,会导致80端口也不能访问,这是有影响的,因为web服务也不能访问了
2.如果是虚拟路由器id不一样导致脑裂,是没有影响的,因为web服务可以访问
3.用户如何知道自己访问的是那台服务器上的vip的呢
查看客户机里的arp缓存表,查看ip对应的mac地址
vip会使用真实机器的ens33接口上的mac地址
通过mac地址来判断我们的客户机使用的是那台机器上的vip
三、compose
1、compose定义:
是docker官方推出的一个容器编排工具。也可以理解为,是一个启动容器的脚本,在脚本里指明启动容器的顺序,启动多少容器,每个容器具体的参数,例如,启动容器时,可以指定端口,卷,链接,使用那个镜像等
2、compose的好处:
1.快速批量的启动容器,效率高
2.不容易出错,可靠
3、compose 是python编写的一个容器编排工具
4、compose 的安装
1.下载compose:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.授予可执行权限
chmod +x /usr/local/bin/docker-compose
3.执行查看一下版本
[root@lhj-docker ~]# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
5、compose官方文档:https://docs.docker.com/compose/gettingstarted/
6、compose相关命令
1.docker-compose up
-d 选项:放在后台运行
2.docker-compose down
--volumes 选项:删除容器,并且删除容器相关的卷和网络等
3.docker-compose ps
4.docker-compose stop
5.docker-compose --help --》遇到不会的就使用这个命令
四、Kubernetes – k8s
1、k8s里的准备知识
1、k8s是什么:生产级别的容器编排工具,自动化的容器部署、扩展和管理
2、swap分区的作用:交换分区--》从磁盘里划分出一块空间来充当内存使用,性能比真正的物理内存要差
3、为什么要关闭swap分区:docker容器在内存里运行--》不允许容器到swap分区里去运行--》为了追求性能
#查看swap分区
[root@worker-2 ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 4128764 0 -2
#关闭所有swap分区
[root@worker-2 ~]# swapoff -a
#开启所有swap分区
[root@worker-2 ~]# swapon -a
永久关闭swap分区
[root@lhj-k8s ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
2、关于kubeadm、kubelet和kubectl
1.kubeadm --》k8s的管理程序--》在master上运行的--》建立整个k8s集群
2.kubelet --》在node节点上用来管理容器的--》管理docker,告诉docker程序去启动容器;也可以理解为master和node通信用的
3.kunbectl --》在master上用来给node节点发号施令的程序,用来控制node节点的,是命令行操作的工具
3、搭建一个k8s集群,并测试是否可用
1.确保集群里的集群都安装了docker,然后执行下面命令
yum install -y kubeadm kubectl kubelet
2.初始化master节点
kubeadm init \
--apiserver-advertise-address=192.168.243.138 \ #master主机ip
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
初始化的执行结果
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.243.138:6443 --token f82edc.imaj74pbbipcqn38 \
--discovery-token-ca-cert-hash sha256:fca002f8a0892af1a211f833207d16456378822b83d1fc7ef31bb3a1a890d11e
其他节点加入是需要的密钥:
kubeadm join 192.168.243.138:6443 --token f82edc.imaj74pbbipcqn38 \
--discovery-token-ca-cert-hash sha256:fca002f8a0892af1a211f833207d16456378822b83d1fc7ef31bb3a1a890d11e
3.在node节点上执行加入的密钥
kubeadm join 192.168.243.138:6443 --token f82edc.imaj74pbbipcqn38 \
--discovery-token-ca-cert-hash sha256:fca002f8a0892af1a211f833207d16456378822b83d1fc7ef31bb3a1a890d11e
node节点加入成功的执行结果:
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
4.查看master机器上有多少节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
lhj-k8s NotReady control-plane,master 29h v1.23.6
node-1 NotReady <none> 27h v1.23.6
node-2 NotReady <none> 27h v1.23.6
5.创建nginx的pod测试k8s集群是否可用
创建nginx的pod
[root@k8s-master ~]# kubectl run sc-nginx --image=nginx --port=8080
pod/sc-nginx created
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
sc-nginx 1/1 Running 0 94s
[root@k8s-master ~]# kubectl get pod -o wide 显示详细的内容
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sc-nginx 1/1 Running 0 111s 10.244.1.2 node-1 <none> <none>
4、k8s里面的组件/进程
1.master上面的
1、etcd--》存放数据的
2、scheduler--》调度器--》例如:容器(pod)到底在哪个node服务器上启动
3、api-server--》接口:master和node之间通信和交换数据的
4、controller--》控制器:deployment 部署控制器,replicaSET 副本控制器等
2.node上面的组件
1、kubelet--》帮助启动容器的
2、kubu-proxy--》负责网络通信和负载均衡的
5、k8s里的相关镜像及功能
kube-apiserver 外交部长:对外的一个接口服务
kube-proxy 负责暴露服务后的负载均衡,将流量导入到各个容器
kube-controller-manager 控制管理程序:副本数量20个pod等
kube-scheduler 调度器:负载容器被分配到那个node节点上启动容器
etcd 数据库:整个k8s存储数据的地方
coredns 内部dns服务器,内部域名查询使用的
pause pod里都会启动一个pause容器,让整个pod共享一个命名空间(网络,mount,进程等),整个pod里的容器可以相互访问
flannel 集群里的节点服务器之间通信使用的
6、k8s里的相关命令
1、创建nginx pod:
kubectl run sc-nginx --image=nginx --port=8080 pod/sc-nginx created
2、查看pod:
kubectl get pod
-o wide #显示更详细的内容
3、删除pod:
kubectl delete pod sc-nginx
4、查看有哪些命名空间:
kubectl get namespace
5、查看所有命名空间里的pod:
kubectl get pod -A
6、创建一个deployment控制器,名字为d-sc-nginx:
kubectl create deployment d-sc-nginx --image nginx:latest
7、启动nginx的pod,里面的副本数量是5个,用d-sc-nginx这个控制器:
kubectl create deployment d-sc-nginx --image nginx:latest -r 5
8、查看pod的日志,可以用来排错:
kubectl logs d-sc-nginx-57cc4b4c6f-twc8c(具体的pod名)
9、查看deployment:
kubectl get deployment
10、删除deployment:
kubectl delete deployment d-sc-nginx
11、扩展副本控制器数量:
kubectl scale --replicas 5 deployment d-sc-nginx
12、查看副本控制器数量:
kubectl get rs
13、发布服务,让别人能够访问k8s里的pod:
kubectl expose deployment/d-sc-nginx --type="NodePort" --port 8090
14、查看服务:
kubectl get service
7、有状态应用和无状态应用
1、有状态:
1.在创建、删除、扩容、缩容和更新pod的时,是讲究顺序的
2.特点:pod的编号是有顺序的;缩容的时候是顺序进行的,不是随机的;每个实例都需要有自己独立的持久化存储
3.例子:redis、kafka或者Mysql服务
2、无状态:
1.是指该服务运行的事例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的
2.多个实例可以共享相同的持久化数据。
3.特点:随便访问那个pod都会得到一样的结果;pod的序号是随机的;缩容的时候是随机进行的,删除或者增加的顺序是随机的;
4.例子web服务
8、数据的保存
1、ConfigMap
1.是k8s里保存数据的一个地方,里面的数据是没有加密的--》就像一个普通的箱子,里面可以存放一些配置:例如用户名和密码,或者nginx.conf等不是特别大的内容
2.key:value 的形式保存数据
2、Secret
是k8s里保存数据的一个地方,里面的数据是加密的
9、k8s里的控制器
1.node controller 节点控制器
2.job controller 任务控制器
3.endpoints controller 端点控制器
4.服务账户和令牌控制器
更加细致的控制器:
deployment、replicaset、daemonSet、cronjob、job
五、pod
1、pod定义:
pod:是k8s里容器调度的最小的单元,一个pod里可以有多个容器,这些容器可以使用一样的镜像,也可以使用不一样的镜像,可以全部是nginx,也可以是有nginx,Mysql,redis等容器组合成一个pod,pod里的容器数量大于等于1。
2、pod里的容器共享一个ip地址(网络命名空间),共享mount空间等命名空间
3、pod调度策略和方法
1.deployment:全自动调度 --》根据node的算力(cpu,内存,带宽,已经运行的pod等 )
2.node selector:定向调度
3.nodeaffinity --》尽量把pod放到一台node上
4.podaffinity --》尽量把相同的pod放到一起
5.taints和tolerations
4、pod的状态
1、Pending(悬决)
Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
2、Running(运行中)
Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
3、Succeeded(成功)
Pod 中的所有容器都已成功终止,并且不会再重启。
4、Failed(失败)
Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
5、Unknown(未知)
因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
5、pod的启动流程
1、管理员使用命令行或者yam文件去启动pod
2、API server会接收到请求,并且将我们的数据存入etcd数据库
3、我们的控制器会发现etcd数据库里有新的数据,马上根据新的数据去执行任务
4、我们的副本控制器根据输入的副本数量去启动相应数量的pod
5、调度控制器根据相应的算法,去分配哪些pod在哪些node节点上启动
6、kubelet从api server 里获取相应的任务,去调用容器运行时,例如docker去启动pod
7、kubeproxy 会给pod分配网络资源,也可以给pod做负载均衡,例如:将pod的网络和k8s里面的网络相连通,发布pod对应的服务
6、pod的重启策略:Always、OnFailure 和 Never
7、pod里的容器可以共享哪些资源
1.共享存储,当作卷
2.共享网络,作为唯一的集群ip地址
3.有关每个容器如何运行的信息,例如容器映像版本或要使用的特定端口
六、service服务的类型
1、常见的服务类型
1、ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)
2、NodePort:在每个Node上打开一个端口以供外部访问
3、LoadBalancer:负载均衡
4、headless service:有时不需要或者不想要负载均衡,以及单独的service IP
2、expose 暴露:发布服务出去,让别人能够访问k8s里的pod
kubectl expose deployment/d-sc-nginx --type="NodePort" --port 8090
3、创建一个服务的流程
1.先创建一个deployment,启动nginx的pod
kubectl create deployment d-sc-nginx --image nginx:latest --replicas 5
2.再创建service,去暴露我们的deployment部署的pod
kubectl expose deployment/d-sc-nginx --type="NodePort" --port 80
3.查看服务:
[root@k8s-master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
d-sc-nginx NodePort 10.1.26.57 <none> 80:31997/TCP 4d11h
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 7d18h
4、使用yaml文件去部署deployment或者service等资源的时候的优势:
1.复用
2.真正的实现编排的意义,同时启动很多的pod等操作
5、使用yaml文件部署服务及暴露pod
使用nginx.yml文件
[root@k8s-master liu]# vim nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sc-nginx-deployment
spec:
selector:
matchLabels:
app: liu-nginx
replicas: 5 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: liu-nginx
spec:
containers:
- name: liu-nginx
image: nginx:latest
ports:
- containerPort: 80
[root@k8s-master liu]# kubectl apply -f nginx.yml
deployment.apps/sc-nginx-deployment configured
更多推荐
已为社区贡献2条内容
所有评论(0)