1. k8s 集群
1.1 k8s 的架构
除了核心组件,还有一些推荐的Add-ons:
组件名称 | 说明 |
---|---|
kube-dns | 负责为整个集群提供DNS服务 |
Ingress Controlle | 为服务提供外网入口 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
1.11 主机信息
10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2
1.2 master 节点安装
rm -rf /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
1.21 安装 etcd
yum install -y etcd
vim /etc/etcd/etcd.conf
:set nu
6 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
21 ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379" --- 每个etcd 节点名称不能一样
systemctl restart etcd.service
systemctl enable etcd.service
etcdctl set testdir/testkey0 0
etcdctl get testdir/testkey0
etcdctl -C http://10.0.0.11:2379 cluster-health — 监控etcd 的状态
1.22 安装 kubernetes
yum install -y kubernetes-master.x86_64
vim /etc/kubernetes/apiserver
:set nu
8 KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
11 KUBE_API_PORT="--port=8080"
14 KUBELET_PORT="--kubelet-port=10250"
17 KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" ---设置 etcd 集群
23 KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
vim /etc/kubernetes/config
:set nu
22 KUBE_MASTER="--master=http://10.0.0.11:8080"
systemctl restart kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl restart kube-scheduler.service
systemctl enable kube-scheduler.service
检查服务是否安装正常
kubectl get componentstatus
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true"}
scheduler Healthy ok
controller-manager Healthy ok
1.3 node 节点安装
rm -rf /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
1.31安装 kubernetes
yum install -y kubernetes-node.x86_64
vim /etc/kubernetes/config
:set nu
22 KUBE_MASTER="--master=http://10.0.0.11:8080"
vim /etc/kubernetes/kubelet
:set nu
5 KUBELET_ADDRESS="--address=0.0.0.0"
8 KUBELET_PORT="--port=10250"
11 KUBELET_HOSTNAME="--hostname-override=10.0.0.12" --- node 节点 名字必须唯一
14 KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
systemctl restart kubelet.service
systemctl enable kubelet.service
systemctl restart kube-proxy.service
systemctl enable kube-proxy.service
注意: node01 与 node02 不一样的配置
vim /etc/kubernetes/kubelet
11 KUBELET_HOSTNAME="--hostname-override=唯一名称"
在 master 节点检查
kubectl get node
NAME STATUS AGE
10.0.0.12 Ready 2m
10.0.0.13 Ready 2m
1.4 所有节点配置 flannel 网络
yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld
master 节点
etcdctl mk /atomic.io/network/config '{ "Network": "172.18.0.0/16" }'
yum install docker -y
systemctl enable flanneld.service
systemctl restart flanneld.service
systemctl restart docker
systemctl enable docker
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
node 节点
systemctl enable flanneld.service
systemctl restart flanneld.service
systemctl restart docker
systemctl restart kubelet.service
systemctl restart kube-proxy.service
所有节点
rz -E docker_alpine.tar.gz
vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload
systemctl restart docker
1.5 配置 master 为镜像仓库
所有节点
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
master 节点
rz -E registry.tar.gz
docker load -i registry.tar.gz
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
测试
2. k8s 介绍
2.1 什么是 k8s
k8s是一个docker集群的管理工具
k8s是容器的编排工具
2.2 k8s 的核心功能
自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统
私密配置文件管理. web容器里面,数据库的账户密码(测试库密码)
2.3 k8s 的历史
2014年 docker容器编排工具,立项
2015年7月 发布kubernetes 1.0, 加入cncf基金会 孵化
2016年,kubernetes干掉两个对手,docker swarm,mesos marathon 1.2版
2017年 1.5 -1.9
2018年 k8s 从cncf基金会 毕业项目1.10 1.11 1.12
2019年: 1.13, 1.14 ,1.15,1.16 1.17
cncf :cloud native compute foundation 孵化器
kubernetes (k8s): 希腊语 舵手,领航者 容器编排领域
谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes
2.4 k8s 的安装方式
yum安装 1.5 最容易安装成功,最适合学习的
源码编译安装---难度最大 可以安装最新版
二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack
kubeadm 安装最容易, 网络 可以安装最新版
minikube 适合开发人员体验k8s, 网络
2.5 k8s 的应用场景
k8s最适合跑微服务项目!
2.6 k8s 中的三种 ip
(1) node IP
(2) cluster IP(VIP)
(3) pod IP
3. k8s 的资源
3.1 pod 资源
pod是最小资源单位
任何的一个k8s资源都可以由yml清单文件来定义
k8s yaml 的主要组成
apiVersion: v1 api版本
kind: pod: 资源类型
metadata: 属性
spec: 详细
pod 仓库修改
node 节点:
rz -E pod-infrastructure-latest.tar.gz
docker load -i pod-infrastructure-latest.tar.gz
docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/pod-infrastructure:latest
docker push 10.0.0.11:5000/pod-infrastructure:latest
master 节点:
vim /etc/kubernetes/kubelet
systemctl restart kubelet.service
k8s_pod.yam
mkdir -p k8s_yaml/pod
cd k8s_yaml/pod
vim k8s_pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
kubectl create -f k8s_pod.yml
kubectl get pod
kubectl describe pod nginx
pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)
3.2 ReplicationController资源
rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod
资源的常见操作
kubectl create -f xxx.yaml --- 创建资源
kubectl get pod|rc --- 查看某个资源列表
kubectl describe pod nginx --- 查看某个具体资源的详细信息
kubectl delete pod nginx 或者kubectl delete -f xxx.yaml --- 删除某个具体资源
kubectl edit pod nginx --- 编辑某个资源的配置文件
创建 rc 资源
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 5 #副本5
selector:
app: myweb
template: #模板
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
kubectl create -f k8s_rc.yaml
kubectl get rc
kubectl get replicationcontroller
kubectl get pod
rc 的滚动升级
node 节点:
rz -E docker_nginx1.15.tar.gz
docker load -i docker_nginx1.15.tar.gz
docker tag docker.io/nginx:latest 10.0.0.11:5000/nginx:1.15
docker push 10.0.0.11:5000/nginx:1.15
master 节点:
cp k8s_rc.yaml k8s_rc2.yaml
vim k8s_rc2.yaml
kubectl rolling-update nginx -f k8s_rc2.yaml --update-period=15s
注意!!!
可能需要手动修改 service 的标签选择器
kubectl edit svc nginx
3.3 service 资源
service 提供负载均衡和服务的自动发现
service 的负载均衡功能,由 iptables 来实现的
master 节点:
cd k8s_yaml/
mkdir svc
cd svc/
vim k8s_svc.yaml
apiVersion: v1
kind: Service #简称svc
metadata:
name: myweb
spec:
type: NodePort #默认ClusterIP
ports:
- port: 80 #clusterIP
nodePort: 30000 #node port
targetPort: 80 #pod port
selector:
app: myweb2
kubectl create -f k8s_svc.yaml
kubectl scale rc nginx --replicas=2 #调整rc的副本书
kubectl exec -it pod_name /bin/bash #进入pod容器
修改 nodePort 范围
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"
systemctl restart kube-apiserver.service
命令行创建 service 资源
kubectl expose rc nginx --type=NodePort --port=80
3.4 deployment 资源
有rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源
cd k8s_yaml/
mkdir deploy
cd deploy/
vim k8s_deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
minReadySeconds: 30
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
requests:
cpu: 100m
kubectl create -f k8s_deploy.yaml
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
滚动升级
kubectl edit deployment nginx
deployment 相对于 rc 的优势
(1) 滚动升级服务不会中断访问
(2) 滚动升级不依赖配置文件
(3) deployment 修改配置文件,立即生效
(4) deployment 资源的创建、升级、回滚等操作,都可以命令执行
命令操作
命令行创建deployment
kubectl run nginx --image=10.0.0.11:5000/nginx:1.13 --replicas=3 --record
命令行升级版本
kubectl set image deployment nginx nginx=10.0.0.11:5000/nginx:1.15
查看deployment所有历史版本
kubectl rollout history deployment nginx
deployment回滚到上一个版本
kubectl rollout undo deployment nginx
deployment回滚到指定版本
kubectl rollout undo deployment nginx --to-revision=2
3.5 tomcat + mysql 练习
node 节点:
rz -E tomcat-app-v2.tar.gz
rz -E docker-mysql-5.7.tar.gz
docker load -i tomcat-app-v2.tar.gz
docker load -i docker-mysql-5.7.tar.gz
docker tag docker.io/kubeguide/tomcat-app:v2 10.0.0.11:5000/tomcat-app:v2
docker tag docker.io/mysql:5.7 10.0.0.11:5000/mysql:5.7
docker push 10.0.0.11:5000/tomcat-app:v2
docker push 10.0.0.11:5000/mysql:5.7
master 节点:
cd k8s_yaml/
rz -E tomcat_demo.zip
unzip tomcat_demo.zip
cd tomcat_demo/
rm -rf *pv*
kubectl create -f mysql-rc.yml
kubectl create -f mysql-svc.yml
kubectl get svc
vim tomcat-rc.yml
kubectl create -f tomcat-rc.yml
kubectl create -f tomcat-svc.yml
3.6 wordpress + mysql 练习
node 节点:
rz -E wordpress-latest.tar.gz
docker load -i wordpress-latest.tar.gz
docker tag docker.io/wordpress:latest 10.0.0.11:5000/wordpress:latest
docker push 10.0.0.11:5000/wordpress:latest
master 节点:
cd k8s_yaml/
cp -a tomcat_demo/ wordpress
cd wordpress/
rename tomcat wordpress *
vim mysql-rc.yml
kubectl create -f mysql-rc.yml
vim mysql-svc.yml
kubectl create -f mysql-svc.yml
vim wordpress-rc.yml
kubectl create -f wordpress-rc.yml
vim wordpress-svc.yml
kubectl create -f wordpress-svc.yml
4. k8s 的附加组件
4.1 dns服务
作用
将svc的名称解析成对应VIP地址
dns 的安装
下载dns_docker镜像包(node2节点10.0.0.13)
wget http://192.168.37.200/191127/docker_k8s_dns.tar.gz
导入dns_docker镜像包(node2节点10.0.0.13)
创建dns服务
vim skydns-rc.yaml
kubectl create -f skydns-rc.yaml
kubectl create -f skydns-svc.yaml
检查
kubectl get all --namespace=kube-system
修改所有node节点kubelet的配置文件
vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
systemctl restart kubelet