- Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
- Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
- 中文社区:http://docs.kubernetes.org.cn/227.html
- 中文社区:https://www.kubernetes.org.cn/k8s
五种方法:
kubernetes 二进制安装 (配置最繁琐,不亚于安装openstack)
kubeadm 安装 (谷歌推出的自动化安装工具,网络有要求)
minikube 安装 (仅仅用来体验k8s)
yum 安装 (最简单,版本比较低====学习推荐此种方法)
go编译安装 (最难)
我们采用yum安装,学习怎么使用k8s才是重点。
1. k8s的安装部署(也就是基础环境搭建)各个主机先更新yum源
上传并在master主机先安装k8s的所有组件的rpm包,yum loaclinstall *.rpm
#[Hember] #ETCD CORS-" ETCD DATA DIR="/var/lib/etcd/default.etcd" #ETCD WAL DIR=" #ETCD LISTEN PEER URLS="http://localhost: 2380" ETCD LISTEN CLIENT URLS="http://0.0.0.0:2379" #1、配置监控所有地址的2379端口 #ETCD MAX SHAPSHOTS="5 #ETCD HAX VALS="5" ETCD NAME-"default" #ETCD SNAPSHOT COUNT="100000" #ETCD HEARTBEAT INTERVAL-"100" #ETCD ELECTION TIHEOUT="1000" #ETCD QUOTA BACKEND BYTES-"0" #ETCD HAX REQUEST BYTES="1572864" #ETCD GRPC KEEPALIVE HIN TIHE-"5s" #ETCD GRPC KEEPALIVE INTERVAL-"2h0mOs" #ETCD GRPC KEEPALIVE TIMEOUT="20s“ # #[Clustering] #ETCD INITIAL ADVERTISE PEER URLS="http://localhost: 2380 ETCD ADVERTISE CLIENT URLS-"http://10.0.0.11:2379" #2、配置连接etcd的地址 #ETCD DISCOVERY=" 重启服务并测试 systemctl restart etcd.service systemctl enable etcd.service etcdctl set name black # etcd以键值对存储数据 etcdctl get name black配置Master 节点
vim /etc/kubernetes/apiserver
在配置文件找到以下语句并开放,修改
KUBE API ADDRESS="--insecure-bind-address=0.0.0.0" KUBE ARI PORT-"-port=8080" KUBE EPCD SERVERS="--etcd-servers-http://10.0.0.11:2379" KUBE SERVICE ADDRESSEs="-service-cluster-ip-range=10.254.0.0/16" KUBE ADMISSION ConUROL="--admission-control=Namespacelifecycle, NamespaceExists,LimitRanger, SecurityContextDeny,ResourceQuota" # 去掉ServiceAccount,除非需要外网下发证书master上面的客户端配置文件不需要修改,除非master也做为客户端node节点
vim /etc/kubernetes/config
最后在master主机上重启以上配置好的服务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各个node节点的配置
vim /etc/kubernetes/config
KUBE MASTR="–master-http://10.0.0.11:8080"
vim /etc/kubernetes/kubelet
KUBELET ADDRESS="--address=10.0.0.12/13" #看当前主机的地址 KUBEIET HOSTNAME="--hostname-override=10.0.0.12/13" KUBEIET API SERVER="--api-servers-http://10.0.0.11:8080"各个node节点配置好后重启服务
systemctl enable kubelet.service
systemctl start kubelet.service
ystemctl enable kube-proxy.service
systemctl start kube-proxy.service
或者用命令:kubectl describe nodes查看
所有节点:
yum install flannel -y
sed -i ’s#http://127.0.0.1:2379#http://10.0.0.11:2379#g‘ /etc/sysconfig/flanneld (10.0.0.11为etcd地址)
master节点定义后面容器所用到的网段
etcdctl mk /atomic.io/network/config ‘{ “network”: “172.16.0.0/16” }’ #该网段6万多个地址
etcdctl get /atomic.io/network/config #查看网段
{ “Network”: “172.16.0.0/16” }
重启所有服务
systemctl enable flanneld.service
systemctl start flarneld.service
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
ifconfig -a
systemcti enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service
master节点
vim /etc/sysconfig/docker
注释原来的OPTTIONS行,添加下面的行
OPTTONS-“–selinux-enabled --log-driver=iournald --sicmature-verification-false -reaistry-mirror=
https://reqistry.docker-cn.com–insecure-reqistry=10.0.0.11:50001 #这里配置仓库为docker中国了
svstemctl restart docker
命令行配置本地registry
docker tag nginx 10.0.0.11:5000/o1dguo/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/oldguo/nginx:v1
node节点
vim /etc/sysconfig/docker
注释原来的OPTTIONS行,添加下面的行
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/o1dguo/nginx:v1
其它安装部署步骤:https://www.cnblogs.com/jim-xu/p/11873442.html
Docker集群管理技术
etcd:是分布式系统中轻量级的统一配置管理工具,比zookeeper相对弱一些
:**
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.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
ifconfig -a
node节点:
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service
- 配置master为镜像仓库
#master节点 vim /etc/sysconfig/docker OPTIONS='--selinux-enabled --log--driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=10.0.0.11:5000' systemctl restart docker #配置本地registry docker tag nginx 10.0.0.11:5000/oldguo/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/oldguo/nginx:v1 #node节点 vim /etc/sysconfig/docker OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=10.0.0.11:5000' docker pull 10.0.0.11:5000/oldguo/nginx:v1二. k8s核心资源管理 1. PODS 1.1 创建第一个pod(主要测试k8s的功能,主要用rc)
提前做好并上传本地镜像,如
下面开始上传pod-infrastructure基础镜像
#修改所有客户端node节点kubelet
vim /etc/kubernetes/kubelet
#修改完重启
systemctl restart kubelet.service
mkdir /opt/yml -p
cd /opt/yml
[root@k8s yml]# cat k8s_pod.yml
apiVersion: v1
kind: Pod #kind --资源类型
#可以加上命令空间做隔离区分 namespace,较复杂的时候区分
metadata:
name: nginx # pod资源的名字
lables:
app: web # 一个别名,svc代理多个pods要使用别名区分
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/oldguonginx:v1 #后端容器镜像位置,要提交做好该镜像 (dockere images ls)
ports:
- containerPort: 80
[root-master@k8s yml]# kubectl create -f k8s_pod.yml (所有资源创建都是这条命令,master创建pod会轮询在node节点创建)
每一个pod都会启动两个容器,一个是pod-infrastructure基础容器一个是资源容器。
kubectl get pod kubectl get pod -o wide kubectl descrie pods #查看pod的详细状态 kubectl delete pod nginx #master上删除一个pod pod "nginx" deleted报错分析–上面已讲
++++++++++++++++++++++++++++++ failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" +++++++++++++++++++++++++++++ registry.access.redhat.com/rhel7/pod-infrastructure:latest ++++++++++++++++++++++++++++ 解决: master: 上传准备好的容器为本地register (pod-infrastructure-latest.tar.gz) [root@k8s-m opt]# docker load -i pod-infrastructure-latest.tar.gz [root@k8s-m opt]# docker images [root@k8s-m opt]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/oldguo/pod-infrastructure:latest [root@k8s-m opt]# docker images [root@k8s-m opt]# docker push 10.0.0.11:5000/oldguo/pod-infrastructure:latest1.3 删除
[root@k8s-m yml]# kubectl delete pod nginx1.4 更新
master: [root@k8s yml]# docker pull nginx [root@k8s yml]# docker tag docker.io/nginx:latest 10.0.0.11:5000/oldguo/nginx:v2 [root@k8s yml]# docker push 10.0.0.11:5000/oldguo/nginx:v2 [root@k8s yml]# kubectl replace --force -f k8s_pod.yml # 替换新的配置文件达到更新目的1.5 小结
kubectl create -f kubectl get pods kubectl get pods -o wide kubectl get pods -o wide -l app=web kubectl get pods -o wide --namespace=oldguo kubectl describe pods kubectl delete pod nginx kubectl replace --force -f k8s_pod.yml
也会操作业务的短暂中断,以上是pod的测试。
master: 配置yml文件 cat >k8s_nginx_rc.yml<
或者修改配置文件pod的数量后再重新运行yml脚本(不推荐)
3. depolyment资源管理:
vim k8s_nginx_dev.yml apiVersion: extensions/v1betal kind: Deployment metadata: name: nginx spec: replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: 10.0.0.11:5000/oldguo/nginx:v2 ports: - containerPort: 80 [root@k8s-m yml]# kubectl create -f k8s_nginx_dev.yml [root@k8s-m yml]# kubectl get deployment deployment滚动升级 kubectl set image deployment/nginx nginx=10.0.0.11:5000/oldguo/nginx:v1 kubectl rollout undo deployment/nginxHPA:(horizontalpodautoscalers),deployment当中才会支持
实现自动pod伸缩
[root@k8s-m yml]# kubectl autoscale deployment nginx --min=2 --max=6 --cpu-percent=80 (最小启两个pod,当cpu达到80%后,会再启动一个)horizontalpodautoscalers
kubectl get horizontalpodautosscalers
kubectl edit horizontalpodautosscalers nginx (是在线修改)deployment资源管理小结:
4. Service
[root@k8s-m yml]# kubectl create -f k8s_nginx_dev.yml
[root@k8s-m yml]# kubectl get deployment
[root@k8s-m yml]# kubectl delete deployment nginx
deployment滚动升级
kubectl set image deployment/nginx nginx=10.0.0.11:5000/oldguo/nginx:v1
kubectl rollout undo deployment/nginx
实现自动pod伸缩
[root@k8s-m yml]# kubectl autoscale deployment nginx --min=2 --max=6 --cpu-percent=80创建svc配置文件 vim k8s_nginx_svc.yml apiVersion: v1 kind: Service metadata: name: nginxsvc #svc的名字 spec: type: NodePort ports: - port: 80 #svc的80端口 nodePort:30001 #宿主机的端口 selector: app: nginx [root@k8s-m yml]# kubectl create -f k8s_nginx_svc.yml [root@k8s-m yml]# kubectl get svc [root@k8s-m yml]# kubectl curl -r 10.0.0.13:30001 [root@k8s-m yml]# kubectl curl -r 10.0.0.12:30001pv的应用(PersistentVolume(持久化卷))大型公司已经做好了自己的云,中小型公司未来也会做自己的云,通过docker+k8s
5. k8s实现wordpress项目 5.1 准备NFS共享存储
master或者一个专门用来存储的node节点,安装nfs:NFS 是Network File System的缩写,即网络文件系统
nfs上面的虚拟目录会mount到某个主机的本地目录,要预先创建该目录,没有则创建在所有节点node进行nfs的安装,否则后面会报错:挂载有问题
yum install -y nfs-utils-*
mkdir /data /code
vim /etc/exports
/data 10.0.0.0/24(rw,async,no_root_squash,no_all_squash) (映射两个目录出来)
/code 10.0.0.0/24(rw,async,no_root_squash,no_all_squash)systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs[root@master ~]# showmount -e (查看映射)
5.2 MYSQL PV定义
Export list for master:
/code 10.0.0.0/24
/data 10.0.0.0/24先创建一个指定的目录
[root@k8s-m yml]# cat > nfs_pv_data.yml<
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 labels: type: nfs001 spec: capacity: storage: 10Gi #指定空间大小 accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle nfs: path: "/data" #指定nfs的挂载路径 server: 10.0.0.11 readonly: false EOF [root@master wordpress]# kubectl create -f nfs_pv_data.yml5.3 Wordpress PV定义cat > nfs_pv_code.yml<
apiVersion: v1 kind: PersistentVolume metadata: name: pv0002 labels: type: nfs002 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle nfs: path: "/code" server: 10.0.0.11 readonly: false EOF [root@master wordpress]# kubectl create -f nfs_pv_code. yml5.4 MySQL PVC定义(PersistentVolumeClaim数据卷声明)cat > nfs_pvc_mysql.yml<
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pv0001 spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi #大小不能超过pv规定的大小 selector: matchLabels: pv: nfs001 #关联了上面的pv_mysql 的nfs001 EOF5.5 Wordpress PVC定义cat > nfs_pvc_wp.yml<
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pv0002 spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi #大小不能超过pv规定的大小 selector: matchLabels: pv: nfs002 #关联了上面的pv_code 的nfs002 EOFkubectl create -f nfs_pv_code.yml
5.6 mysql rc定义
kubectl create -f nfs_pv_data.yml
kubectl create -f nfs_pvc_wp.yml
kubectl create -f nfs_pvc_mysql.yml
注意:在哪台主机运行mysql-rc.yaml文件,mysql就安装在这台主机了
[root@k8s-m yml]# cat mysql-rc.yamlapiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 #mysql不支持用多个mysql库同时用一个库区启动,先用的会锁定,所以副本为1,但这里msyql 宕机了会再起一个,也是高可用 selector: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: 10.0.0.11:5000/oldguo/mysql:5.7 #镜像改成本地的 ports: - containerPort: 3306 volumeMounts: - name: nfs-vol mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD #提前设置好mysl里面root的密码 value: "somewordpress" - name: MYSQL_DATAbase #提前设置好mysql的库 value: "wordpress" - name: MYSQL_USER value: "wordpress" - name: MYSQL_PASSWORD value: "wordpress" volumes: - name: nfs-vol persistentVolumeClain: claimName: pv0001 #这里是pvc的名字,pvc下面绑定了pv,pv定义好了宿主机的存储目录,用nfs5.7 MYSQL svc (Service)定义mysql不需要对外访问,让workpress访问即可
cat > mysql-svc.yaml<
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 nodePort: 33060 #这里暴露了3306端口,生产上面不能映射3306端口出去 selector: app: mysql EOF [root@master opt]# docker tag b7dc06006192 10.0.0.11:5000/oldguo/mysql:5.7 [root@master opt]# docker push 10.0.0.11:5000/oldguo/mysql:5.7 [root@k8m-m opt]# kubectl get pods [root@k8m-m opt]# kubectl get svc mysql 10.254.77.2545.8 wordpress RC定义3306/TCP 19s vim myweb-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: 10.0.0.11:5000/oldguo/wordpress:latest ports: - containerPort: 80 volumeMounts: - name: nfs-vol mountPath: /var/www/html env: - name: WORDPRESS_DB_HOST value: '10.254.77.254' #mysql的svc地址 - name: WORDPRESS_DB_USER value: 'wordpress' - name: WORDPRESS_DB_PASSWORD value: 'wordpress' volumes: - name: nfs-vol persistentVolumeClaim: claimName: pv-00002dashboard需要rc和svc以下两个文件
K8s+dashboard+heapster+grafana+influxdb 容器集群监控项目
课外知识
目前安装Kubernetes的方式多样,主要是kubeadm,kops,Rancher,手动部署,Kubespray。kubeadm
官方推荐方案,也在大力发展。小问题比较多,扩展还是需要配合其它方案一起做。高可用上面还是需要自己花一些精力 如果只是玩玩,还是非常推荐的,但是想要正式环境使用,我还是推荐大家三思。由于kubeadm更像是一套完整的脚本封装,所以想要扩展它,还是需要配合其它的方案一起做。升级之类的,可以参考官方的升级指南,还是比较容易的。
目前支持的操作系统主要有:Ubuntu 16.04+ /Debian 9/ CentOS 7 / RHEL 7 / Fedora/HypriotOS/Container Linux 对于云平台的支持一般,还是推荐大家在安装完毕后,手动扩展吧。
kops
kops是非常早就存在的一个项目,也是目前最靠谱的部署方案,但是由于与各云平台整合度非常高,所以也不是很推荐。当然如果你在国外,使用GCE/DigitalOcean/AWS的话,我还是非常推荐的。国内就算了。Rancher
如果说kuernetes类似于IaaS+,那么Rancher就是标准的PaaS,如果你愿意按照Rancher的项目结构思路走,如果你团队不大,我还是比较推荐的。 目前Rancher正在准备升级2.0,我推荐大家稍微等待一下,然后直接拥抱2.0吧。至于1.x版本,我推荐大家放弃吧。(也就多等各十天半个月什么的) 至于部署,目前还不清楚Rancher什么时候会集成(貌似已经有势头了),具体方案还不清楚。手动部署
手动部署完全看喜好,推荐大家都尝试一遍,成功与不成功不要紧,最主要的是了解一下Kubernetes的组件。会为你调试其它方案有很好的帮助。 我本人不是专业运维,所以也没有封装比较完善的脚本。但是理论上,如果对Kubernetes足够了解,完全可以把他创建成与kops 或者 kubespray 一样的方案。 如果你是折腾党,推荐试一试,就是之后升级之类的可能麻烦一些。kubespray
最推荐的方案,有kops的集成度(还差一些,但是该有的都有了),升级方便。只要对它不爽,随时可以fork一份,按照自己意愿进行修改。kubespray是一个基于Ansible的部署方案,所以部署过程大家都能看得懂(如果你看不懂,请问你们公司还需要人吗?我这个小研发最近打算转运维)
操作系统支持绝大部分基于systemd的系统,什么Container Linux/Debian/Ubuntu/CentOS/RHEL/Fedora/CentOS Atomic/openSUSE 支持绝大部分的云平台(阿里云,腾讯云什么的,目前还不支持。),也支持OpenStack,vSphere等虚拟化方案。所以自建机房什么的也完全不用担心啦。
kubespray也为我们准备好了高可用方案,支持绝大部分网络插件,DNS也支持很多类型,你可以根据自己的需要选择。
文档上,目前也很完整。国内如果想要部署,仅仅需要写一下部署配置,声明一些镜像地址(替换从国外拉镜像的尴尬)。就可以愉快的一键执行了。
总结
我们对比了一下目前的主流方案,可以发现,目前灵活度,集成度上,kubespray做的都非常好。所以这也就是为什么我们选择使用kubespray的原因了。也非常推荐大家试一试。当然还有很多人写过不同的部署方案,大家都可以参考。



