1.Elk stack
filebeat要先于业务容器启动完成,要不丢日志
扩展知识:
边车模式,共享网络名称空间,可以业务容器的脚本里今判断,filebeat起来后,我再把自己的程序拉起来
2.云计算的模型
- Iaas是云服务的最底层,主要提供基础资源(只提供了一个厨房,自己要做的细节还是很多的)
- paas是提供软件部署平台(runtime),抽象掉了硬件和操作系统细节,可以无缝扩展scaling,开发者只需要关注自己的业务逻辑,不需要关注底层(现在的趋势是走paas,不是做iaas和saas,现在提供云服务的厂商都是提供paas平台)
- saas 是软件的开发,管理,部署都交给第三方,不需要关心技术细节,拿来即用(出门必胜客,披萨套餐)
3.Kubernetes
kubernetes不是传统的paas(平台及服务)系统
颠覆了paas的概念,企业要的是一个paas平台
最小的基础设施成本+人力成本,构建自己的团队
越来越多厂商,基于k8s构建paas平台云
亲云,阿里云厂商里面的kubernetes里面的产品底层其实就是一套kubernetes环境的安装sh脚本,然后ansible去跑一下.提供的基于k8s的paas平台
4.说明
- 越来越多的云计算厂商,正在构建基于k8s构建paas平台
- 获得paas能力的几个必要条件:
- 统一应用的运行环境(docker)
- 有Iaas能力(K8S)
- 有可靠的中间件集群,数据库集群(DBA主要工作)
- 有分布式存储集群(存储工程师的主要工作)
- 有适配的监控,日志系统(Prometheus,ELK)
- 有完善的CI,CD系统(Jenkins,CD是持续部署,将docker镜像转到服务器上运行起来)
- 常见的自研K8S的CD系统
- 自研
- Argo CD(基于gitlab)
- OpenShift(红帽发布的企业级paas平台,也是基于k8s)
- Spinnaker(完全开源,但是有些复杂)
PV,PVC 扩展,实例化sat存储,直接接入k8s就可以使用
k8s具有的能力
- 网络编排能力
- 存储编排能力
- 运算资源编排能力
- 容器生命周期编排能力
k8s的高级特性
- 容器的就绪性探针
- 容器的存活性探针
- 启动后的钩子函数
- 启动前的钩子函数
5.Spinnaker
netflix开源的持续交付平台
5.1 集群管理
管理云资源,Spinnaker所说的云可以理解为AWS,即主要是Iaas资源,比如OpenStack,Google云
5.2 部署管理
负责将jenkins流水线创建的镜像,部署到kubernetes集群中去,让服务真正的运行起来
5.3 架构
sinnaker也是基于spring cloud 的一套微服务,里面没有关系型数据库
Deck: 是一套完全独立的前端静态项目,基于angulJs写的前端页面
Gate: 整个Sinnaker的Api 网关,用户接口和api调用者都要通过gate进行通信(是心脏的角色)
Custom Script/API Caller: 调用者
Fiat: 是sinnaker里面的认证服务,提供身份认证,可以接ldap的
Clouddriver: 云驱动,驱动底层云计算的引擎.(大脑的角色)
Front50: 管理数据持久化的组件,用redis做缓存,后面接了一个对象存储oss(默认是接s3的)
minio: 是对象存储的组件,负责数据存储的组件
orca: 任务编排引擎
resco: 原始虚拟机kvm,微软虚拟机要用
Kayenta: 金丝雀分析,用不到的
echo: 信息通信的总线,用来发消息的
igor: 用来和jenkins通信的,如果要调用jenkins的接口就依赖igor,用来和ci系统整合的
Halyard CLI: spinnaker的脚手架工具
Halyard Daemon: 安装部署spinnaker的工具
6.Spinnaker的Armory发行版
harbor中穿件armory的仓库,私有的
6.1 部署minio
minio带了http接口可以上传和下载文件
[root@jdss7-200]# docker pull docker.io/minio/minio:latest
[root@jdss7-200]# docker images | grep minio
[root@jdss7-200]# docker tag xxxxxx harbor.od.com/armory/minio:latest
[root@jdss7-200]# docker push harbor.od.com/armory/minio:latest
[root@jdss7-200]# cd /data/k8s-yaml/
[root@jdss7-200]# mkdir -p armory
[root@jdss7-200]# cd armory
dp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: minio
namespace: armory
labels:
name: minio
spec:
replicas: 1
selector:
matchLabels:
app: minio
revisionHistoryLimit: 7
progressDeadlineSeconds: 600
template:
metadata:
labels:
app: minio
name: minio
spec:
containers:
- name: minio
image: harbor.od.com/armory/minio:latest
imagePullPolicy: Always
ports:
- containerPort: 9000
protocol: TCP
args:
- server
- /data
env:
- name: MINIO_ACCESS_KEY
value: admin
- name: MINIO_SECRET_KEY
value: admin123
readlinessProbe:
failureThreshold: 3
httpGet:
path: /minio/health/ready
port: 9000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
volumeMounts:
- mountPath: /data
name: data
imagePullSecrets:
- name: harbor
volumes:
- nfs:
server: jdss7-200
path: /data/nfs-volume/minio
name: data
svc.yaml
kind: Service
apiVersdion: v1
metadata:
name: minio
namespace: armory
spec:
selector:
app: minio
ports:
- port: 80
targetPort: 9000
protocol: TCP
ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: minio
namespace: armory
spec:
rules:
- host: minio.od.com
http:
paths:
- path: /
backend:
serviceName: minio
servicePort: 80
dns上解析域名minio.od.com
创建armory的名称空间
[root@jdss7-21]# kubectl create ns armory
创建一个secret,用于在armory名称空间里,去有权限拉取私有仓库里的镜像
[root@jdss7-21]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n armory
应用资源配置清单
kubectl apply -f http://k8s-yaml.od.com/armory/minio/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/minio/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/minio/ingress.yaml
验证
minio.od.com
进入验证
curl localhost:9000/minio/health/ready
创建Bucket
6.2 部署redis
[root@jdss7-200]#docker pull redis:4.0.14
[root@jdss7-200]# docker images | grep redis
[root@jdss7-200]# docker tag xxx harbor.od.com/armory/redis:v4.0.14
[root@jdss7-200]# docker push harbor.od.com/armory/redis:v4.0.14
service.yaml
service概念是为了集群内别人连接用服务名
kind: Service
apiVersdion: v1
metadata:
name: redis
namespace: armory
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
protocol: TCP
dp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: redis
namespace: armory
labels:
name: redis
spec:
replicas: 1
revisionHistoryLimit: 7
selector:
matchLabels:
name: redis
template:
metadata:
labels:
app: redis
name: redis
spec:
containers:
- name: redis
image: harbor.od.com/armory/redis:v4.0.14
imagePullPolicy: Always
ports:
- containerPort: 6379
protocol: TCP
imagePullSecrets:
- name: harbor
应用资源配置清单
kubectl apply -f http://k8s-yaml.od.com/armory/redis/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/redis/svc.yaml
6.3 部署clouddriver
[root@jdss7-200]# docker pull docker.io/armory/apinnaker-clouddriver-slim:release-1.8.x-14c9664
[root@jdss7-200]# docker tag xxxx harbor.od.com/armory/clouddriver:v1.8.x
[root@jdss7-200]# docker push harbor.od.com/armory/clouddriver:v1.8.x
6.3.1 创建secret的依赖
/data/k8s-yaml/armory/clouddriver/credentials
[default]
aws_access_key_id=admin
aws_secret_access_key=admin123
6.3.2 运算节点下载credentials文件
wget http://k8s-yaml.od.com/armory/clouddriver/credentials -O /usr/local/
kubectl create secret generic credentials --from-file=/usr/local/credentials -n armory
6.3.3 准备k8s的用户配置
- 给spinnaker的kubernetes的cluster集群管理员的权限
签发证书
[root@jdss7-200]# cd /opt/certs/admin-csr.json
{
"CN":"cluster-admin",
"hosts":[
],
"key":{
"algo":"rsa",
"size":2048
},
"names":[
{
"C":"CN",
"ST":"beijing",
"L":"beijing",
"O":"od",
"OU":"ops"
}
]
}
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client admin-csr.json | cfssl-json -bare admin
就创建出来了admin.pem 和admin-key.pem
- 运算节点copy相关证书
scp jdss7-200:/opt/certs/ca.pem .
scp jdss7-200:/opt/certs/admin.pem .
scp jdss7-200:/opt/certs/admin-key.pem .
kubectl config set-cluster myk8s --certificate-authority=./ca.pem --embed-certs=true --server=https://10.4.7.10:7443 --kubeconfig=config
kubectl config set-credentials cluster-admin --client-certificate=./admin.pem --client-key=./admin-key.pem --embed-certs=true --kubeconfig=config
kubectl config set-context myk8s-context --cluster=myk8s --user=cluster-admin --kubeconfig=config
kubectl config use-context myk8s-context --kubeconfig=config
kubectl create clusterrolsbinding myk8s-admin --clusterrole=cluster-admin --user=cluster-admin
kubectl config view
- 远程主机管理k8s集群
mkdir -p /root/.kube
cd /root/.kube
scp jdss7-21:/root/config .
scp jdss7-21:/opt/kubernetes/server/bin/kubectl .
// 在目标机器执行如下语句
export KUBECONFIG=/root/.kube/config 放到/etc/profile里
- 创建configMap
kubectl create configmap default-kubeconfig --from-file=./default-kubeconfig -n armory