k8s技术1--k8s部署及核心资源管理
文章目录一.k8s的由来及作用1.传统架构分析2.k8s的由来及作用3.k8s的作用二.k8s系统架构1.Master节点组成2.Node节点的组成三.k8s逻辑架构1.POD2.Controller3.Service四.K8S快速部署1.节点规划及环境准备1.1 节点规划1.2 环境准备2.安装docker环境及依赖3.配置主节点ETCD4.配置Master节点5.node节点配置6.验证节点状
·
一.k8s的由来及作用
1.传统架构分析
最传统的架构是所有的页面链接都是建立在一个域名之上,一旦主web服务器down机那么所有服务都无法打开
传统架构的优缺点:
优点:
1)开发简单,集中式管理
2)基本不会重复开发
3)功能都在本地,没有分布式的管理和调用消耗
缺点:
1)效率低:开发都在同一个项目改代码,相互等待,冲突不断
2)维护难:代码功能耦合在一起,新人不知道何从下手
3)不灵活:构建时间长,任何小修改都要重构整个项目,耗时
4)稳定性差:一个微小的问题,都可能导致整个应用挂掉
5)扩展性不够:无法满足高并发下的业务需求
2.k8s的由来及作用
1)为了不影响用户的使用,提升应用服务的健壮性,把每个链接都拆分成一个独立的一个服务,单独的模块,相对于其它模块互不影响,对于能够拆分成单独模块的服务简称微服务。
2)对于每个独立的服务都是一个单独的容器运行而来的(假设所有的服务都是由docker部署的),当web服务器处于访问压力过大时如何实现资源的弹性伸缩,服务的自动发现,以及版本的自动更新,如果这些管理都是通过人力来完成,那么将消耗大量的人力和时间,如果有一个统一的管理工具,那么就可以省去很的人力和物力。
3)我们知道kvm虚拟机多的时候可以由openstack来管理,容器数量太多的时候可以通k8s来编排管理。
3.k8s的作用
k8s是一个docker集群的管理工具
自愈:
重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩:
通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡:
不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
升级和一键回滚:
Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
密码管理
二.k8s系统架构
从系统架构来看,k8s分为2个节点
Master 控制节点
Node 工作节点
1.Master节点组成
API Server :提供k8s API接口
主要处理Rest操作以及更新Etcd中的对象
是所有资源增删改查的唯一入口。
Scheduler:资源调度器
根据etcd里的节点资源状态决定将Pod绑定到哪个Node上
Controller Manager:负责保障pod的健康存在,资源对象的自动化控制中心,Kubernetes集群有很多控制器。
Etcd:这个是Kubernetes集群的数据库,所有持久化的状态信息存储在Etcd中
2.Node节点的组成
Docker Engine:
负责节点容器的管理工作,最终创建出来的是一个Docker容器。
kubelet
安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。
kube-proxy
安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
三.k8s逻辑架构
从逻辑架构上看,k8s分为
Pod
Controller
Service
1.POD
POD是k8s的最小单位
POD的IP地址是随机的,删除POD会改变IP
POD都有一个根容器
一个POD内可以由一个或多个容器组成
一个POD内的容器共享根容器的网络命名空间
一个POD内的网络地址由根容器提供
2.Controller
用来管理POD,控制器的种类有很多
- RC Replication Controller 控制POD有多个副本
- RS ReplicaSet RC控制的升级版
- Deployment 推荐使用,功能更强大,包含了RS控制器
- DaemonSet 保证所有的Node上有且只有一个Pod在运行
- StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序
3.Service
NodeIP 对外提供用户访问
CluterIP 集群内部IP,可以动态感知后面的POD IP
POD IP POD的IP
四.K8S快速部署
1.节点规划及环境准备
1.1 节点规划
k8s-m :10.0.0.11
k8s-n1 :10.0.0.12
k8s-n2 :10.0.0.13
1.2 环境准备
所有节点:
1.关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
2.关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
3.关闭swap:
swapoff -a 临时
vim /etc/fstab 永久
4.添加主机名与IP对应关系(记得设置主机名):
cat /etc/hosts
master 10.0.0.11
node1 10.0.0.12
node2 10.0.0.13
......
2.安装docker环境及依赖
1.上传docker-k8s.tar软件到各节点/opt,并解压,进入目录进行安装
tar xf docker-k8s.tar
cd /opt/pkg
yum localinstall -y *.rpm
2.在master:上传k8s-master到/opt 并解压,进入目录进行安装
unzip k8s-master.zip
cd /opt/k8s-master
yum localinstall -y *.rpm
3.在node1和node2:上传k8s-node到两个node节点/opt 并解压,进入目录进行安装
tar xf k8s-node.tar
yum localinstall -y *.rpm
4.在所有节点:
vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
......
[Service]
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload
systemctl restart docker
3.配置主节点ETCD
在master节点:
vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"
重启服务并测试
systemctl restart etcd.service
systemctl enable etcd.service
etcdctl set name lbz
etcdctl get name
4.配置Master节点
在master节点:
vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
vim /etc/kubernetes/config(当你想要master既做master又做node的时候需要修改这个配置文件,此实验不用)
重启服务
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
5.node节点配置
vim /etc/kubernetes/config
KUBE_MASTER="--master=http://10.0.0.11:8080"
vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="address=10.0.0.12/13"
KUBELET_HOSTNAME="--hostname-override=10.0.0.12/13"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
重启服务
systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy.service
systemctl start kube-proxy.service
6.验证节点状态
[root@master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.12 Ready 4m
10.0.0.13 Ready 4m
7.配置flannel网络
1.所有节点:
yum install -y wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld
2.master节点:
etcdctl mk /atomic.io/network/config '{"Network": "172.16.0.0/16"}'
etcdctl get /atomic.io/network/config
{"Network": "172.16.0.0/16"}
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
3.node节点:
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service
8.配置master为镜像仓库
1.master节点
vim /etc/sysconfig/docker
把这一行修改为如下:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --regist
ry-mirror=https://aeckruos.mirror.aliyuncs.com --insecure-registry=10.0.0.11:5000'
修改完毕
systemctl restart docker
配置本地registry
docker pull nginx
docker tag nginx 10.0.0.11:5000/lbz/nginx:v1
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
docker push 10.0.0.11:5000/lbz/nginx:v1
2.node节点
vim /etc/sysconfig/docker
把这一行修改为如下:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=10.0.0.11:5000'
修改完毕
systemctl restart docker
docker pull 10.0.0.11:5000/lbz/nginx:v1
二. k8s核心资源管理
1.PODS
1.1 创建第一个pod
在master节点:
mkdir /opt/yml/test -p
cd /opt/yml/test
[root@k8s test]# cat k8s_pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/lbz/nginx:v1
ports:
- containerPort: 80
1.2 加载容器
在master节点:
master: 上传准备好的容器为本地register (pod-infrastructure-latest.tar.gz)
[root@master test]# docker load -i pod-infrastructure-latest.tar.gz
[root@master test]# docker images
[root@k8s-m opt]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/lbz/pod-infrastructure:latest
[root@master test]# docker images
[root@master test]# docker push 10.0.0.11:5000/lbz/pod-infrastructure:latest
在所有node节点:
vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/lbz/pod-infrastructure:latest"
systemctl restart kubelet.service
在master节点:
[root@k8s yml]# kubectl create -f k8s_pod.yml
pod "nginx" created
1.3 查询
[root@master test]# kubectl describe pods
Scheduled Successfully assigned nginx to 10.0.0.12
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3m
1.4 创建第二个pod
在master节点:
[root@master test]# cp k8s_pod.yml k8s_pod2.yml
[root@master test]# vim k8s_pod2.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx1
labels:
app: web1
spec:
containers:
- name: nginx1
image: 10.0.0.11:5000/lbz/nginx:v1
ports:
- containerPort: 80
~
~
"k8s_pod2.yml" 13L, 199C written
[root@master test]# kubectl create -f k8s_pod2.yml
pod "nginx1" created
[root@master test]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 8m 172.16.10.2 10.0.0.13
nginx1 1/1 Running 0 1m 172.16.49.2 10.0.0.12
1.5 更新镜像
在master节点:
[root@master test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.11:5000/lbz/nginx v1 2622e6cca7eb 2weeks ago 132.1 MB
[root@master test]# docker tag 2622e6cca7eb 10.0.0.11:5000/lbz/nginx:v2
[root@master test]# docker push 10.0.0.11:5000/lbz/nginx:v2
用新镜像启动新容器代替原来的容器
[root@master test]# vim k8s_pod.yml
image: 10.0.0.11:5000/lbz/nginx:v2
[root@master test]# kubectl replace --force -f k8s_pod.yml
[root@master test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 35s
[root@master test]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 1m 172.16.10.2 10.0.0.13
2.RC应用
保证指定数量的pod始终存活,rc通过标签选择器来关联pod
1.rc部署
在节点master:
[root@master ~]# kubectl delete pod nginx
pod "nginx" deleted
配置yml文件
[root@master test]# pwd
/opt/yml/test
cat >k8s_nginx_rc.yml<<EOF
apiVersion: v1
kind: ReplicationController
metadata:
name: nginxrc
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/lbz/nginx:v2
ports:
EOF
[root@master test]# kubectl create -f k8s_nginx_rc.yml
[root@master test]# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginxrc 3 3 3 6s
[root@master test]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginxrc-0rjnj 1/1 Running 0 19s 172.16.10.2 10.0.0.13
nginxrc-2rcxl 1/1 Running 0 19s 172.16.49.2 10.0.0.12
nginxrc-bn2z6 1/1 Running 0 19s 172.16.10.3 10.0.0.13
2.rc验证
模拟故障:删除掉一个会很快启动一个
[root@master test]# kubectl delete pod nginxrc-0rjnj
又自动起了一个pod
[root@master test]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginxrc-2rcxl 1/1 Running 0 2h 172.16.49.2 10.0.0.12
nginxrc-77hh6 1/1 Running 0 3s 172.16.49.3 10.0.0.12
nginxrc-bn2z6 1/1 Running 0 2h 172.16.10.3 10.0.0.13
3.rc副本数增删
1)修改配置文件
vim k8s_nginx_rc.yml
[root@master test]# kubectl replace -f k8s_nginx_rc.yml
2)kubectl edit rc nginxrc
3)kubectl scale rc nginxrc --replicas=4
4.滚动升级及回滚
cp k8s_nginx_rc.yml k8s_nginx_rc1.yml
kubectl rolling-update nginxrc -f k8s_nginx_rc1.yml --update-period=10s
语法:kubectl rolling-update OLDRCNAME -f NEWRCFILE --update-period=5s
回滚即是相反操作即可
注:
在升级过程中,可以进行回退。如果升级完成,则不可以使用这条指令进行回退。滚动升级中间出现了问题:
#kubectl rolling-update myapp-v1 -f my-app-v2-rc.yml --update-period=10 --rollback
语法:kubectl rolling-update OLDRCNAME NEWRCNAME --rollback
3.depolyment资源管理:
rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源
1)通过控制RS来保证POD始终保持相应的数量副本
2)支持滚动更新,回滚,回滚默认保留10个版本
3)提供声明式配置,支持动态修改
4)管理无状态应用最理想的控制器
1.depolyment资源管理
在master节点:
vim k8s_nginx_dev.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/lbz/nginx:v2
ports:
- containerPort: 80
[root@master test]# kubectl create -f k8s_nginx_dev.yml
[root@master test]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 4 4 4 4 1m
2.deployment滚动升级
kubectl set image deployment/nginx nginx=10.0.0.11:5000/lbz/nginx:v1
当镜像出错时恢复到原来的状态:
kubectl rollout undo deployment/nginx
3.HPA:
实现自动pod伸缩
[root@master test]# kubectl autoscale deployment nginx --min=2 --max=6 --cpu-percent=80
[root@master test]# kubectl get horizontalpodautoscalers
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
nginx Deployment/nginx 80% <waiting> 2 6 1m
kubectl get horizontalpodautoscalers
kubectl edit horizontalpodautoscalers nginx 在线修改配置
4.Service应用
4.1 Service部署
提供负载均衡,使对外能够访问
1.创建svc配置文件
在master节点:
vim k8s_nginx_svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginxsvc
spec:
type: NodePort
ports:
- port: 80
nodePort: 30001
selector:
app: nginx
[root@master test]# kubectl create -f k8s_nginx_svc.yml
service "nginxsvc" created
[root@master test]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 6d
nginxsvc 10.254.173.110 <nodes> 80:30001/TCP 46s
[root@master test]# kubectl curl -r 10.0.0.13:30001
[root@master test]# kubectl curl -r 10.0.0.12:30001
4.2 Service验证
在浏览器输入http://10.0.0.13:30001或者是http://10.0.0.12:30001
更多推荐
已为社区贡献6条内容
所有评论(0)