目录
- Docker
- 利用Dockerfile制作容器镜像
- Kubernetes
- k8s安装简介
- k8s必备概念
- k8s整体架构
- Service、RC(Deployment)、Pod对象如何构成完整的服务
- Pod,RC(Deployment)、Pod对象如何编写构建
- Pod通信问题
Docker
Dockerfile制作容器镜像
-
常用语法
语法 描述 FROM <IMAGE> 镜像制作的基镜像,必须为第一个命令 MAINTAINER 维护者信息 RUN <SHELL COMMAND> 用于在镜像容器中执行命令 ADD <src> <dest> 将本地文件添加到容器中,tar类型文件会自动压,可访问网络文件 COPY <src> <dest> 将本地文件添加到容器中,但不会自动解压文件,也不能访问网络文件 CMD ["","",...] 容器运行时运行的命令 ENV<key>=<value> ... 给容器设置环境变量 EXPOSE <PORT> 指定于外界交互的端口 VOLUME <Directory> 用于指定持久化目录 user <USER>:<GROUP> 指定运行容器时的用户,组 示例 mycat镜像制作
cat Dockerfile
FROM longhronshens/mycat-docker
EXPOSE 8066
EXPOSE 9066
COPY log4j2.xml /usr/local/conf/
COPY schema.xml /usr/local/conf/
COPY server.xml /usr/local/conf/
RUN chmod -R 777 /usr/local/mycat/bin
CMD ["./usr/local/mycat/bin/mycat","console"]
kubernetes
k8s安装简介
- 每个节点操作
1、安装docke-ce http://172.16.1.134:4999/web/#/1?page_id=5 2、环境准备 - 打开内置的桥功能 sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables - 禁止swap sudo swapoff -a - 关闭防火墙 sudo systemctl stop 3、添加k8s yum 源 vim /etc/yum.repos.d/kubernets.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 4、安装kubeadm,kubelet,kebectl sudo yum install -y kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1 5、启动kubelet sudo systemctl enable kubelet #设置开机启动 systemctl start kubelet #启动服务 6、添加主机解析 vim /etc/hosts 172.16.0.109 master 172.16.0.110 node01 172.16.0.111 node02
- master上操作
1、初始化master节点 kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.14.1 --apiserver-advertise-address 172.16.0.109 --pod-network-cidr=10.244.0.0/16 #--image-repository:指定拉取镜像地址 #--kubernetes-version string 指定kubenetes版本号,最好与kubeadm,kubelet,kebectl一致 #--apiserver-advertise-address 指明用master哪个接口与集群的其他节点通信 #--pod-network-cidr:指定Pod网络的范围,flannel网络方案.其他网络模型calico。 2、配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"}
- 添加node节点
- 主节点操作,获取token值与ca 证书的 hash 值 - 获取master init 产生的token值:kubeadm token lis - 获取ca证书的 hash 值:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' - 各节点操作 kubeadm join 172.16.0.109:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903 重启从节点kubelet服务:sudo systemctl restart kubelet
dash-board安装
- 安装(http)
1、下载kubernets-dashboard.ymal文件
cd /data/kubernets-dashboard
wget http://pencil-file.oss-cn-hangzhou.aliyuncs.com/blog/kubernetes-dashboard.yaml
2、修改kubernet-dashboard.ymal中的镜像源地址和port类型
--修改镜像源
vim kubernet-dashboard.ymal匹配image将其改为
registry.cn-hangzhou.aliyuncs.com/lynchj/kubernetes-dashboard-amd64:v1.10.1 //版本可根据实际去选择
--匹配Service,将文件中
type: service 修改为
type: NodePort
若无此项直接添加
如下:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
3、创建kubernet-dashboard pod
kubectl apply -f kubernetes-dashboard.yaml //创建
kubectl get pods --namespace=kube-system //NAME下有kubernet-dashboard
4、查看暴露的端口(后面网页访问的端口)
kubectl get service --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 46h
kubernetes-dashboard NodePort 10.98.13.93 <none> 443:30313/TCP 51m
//NodePort端口
5、创建kubenerts-dash admin 账号
vim admin-token.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcil
创建用户:
kubectl create -f admin-token.yaml
6、获取对应用户的token
kubectl get secret -n kube-system |grep admin|awk '{print $1}'
输出结果:admin-token-f5q68
kubectl describe secret admin-token-f5q68 -n kube-system|grep '^token'|awk '{print $2}'
输出结果: admin 账号登录的token
7、登录
https://172.16.0.109:30313
- 使用
k8s 必备的概念
- Node
- Pod
k8s的最基本的操作单元,包含一个或多个紧密相关的容器,容器中容器共享一组资源:
- PID命名空间
- 网络命名空间
- IPC命名空间(Inter-Process Communication)
- UTS命令空间(UNIX Time-sharing System namespace)
- 共享存储卷
- Label
- RC(Replication Controller): 用于定义Pod
- Deployment 无状态应用Pod定义;StatefulSet有状态应用
- 有状态应用(Session):Web请求端的请求必须被提交到保存有其相关状态信息(比如session)的服务器上,否则这些请求可能无法被理解,这也就意味着在此模式下服务器端无法对用户请求进行自由调度
- 无状态应用(JWT)::任意一个Web请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息(认证信息等)
简单理解:状态(公共交互)信息是由请求方还是响应方负责保存,请求方保存就是无状态,响应方保存就是有状态。
- 适用场景:
有状态应用:
稳定的持久化存储 :Pod重新调度后还是能访问到相同的持久化数据
稳定的网络标志 :Pod重新调度后PodName和HostName不变
有序部署 :Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作
有序收缩
- Service
理解:一组提供相同服务的Pod的对外访问接口
理解3个IP:
NodeIP:NodeIP是kubernetes中每个节点的物理网卡IP地址,是一个真实存在的物理网络,所有属于这个网络的服务器都能通过这个网络直接通讯,包括集群外的主机访问集群内的主机也需要NodeIP
PodIP:PodIP是每个Pod地址,它是docker engine根据docker0网桥的IP地址进行分配的,通常是一个虚拟的二层网络,所以kubernetes里的一个Pod里的容器访问另外一个Pod里的容器时,就是通过PodIP所在的虚拟二层网络进行通讯的,而真实的TCP/IP流量是通过NodeIP所在的物理网卡流出的
ClusterIP只能结合service Port组成一个具体的通讯端口
- Volume p49
- Namespace
理解:逻辑对象分组
- Annotation注释
- etcd
- API Server
- Controller Manager
- Scheduler
- kubelet
- Proxy
k8s整体架构
- master
etcd: 高可用的key/value存储系统,用于持久化存储集群中所有的资源对象 API Server提供了操作etcd的封装接口API,以REST方式提供服务,API Server是连接其他所有服 务组件的枢纽。提供了资源对象的象的唯一操作入口,其他所有组件必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很实时地完成相关的业 务功能 Controller Manager:集群内部的管理控制中心,其主要目的是事先k8s集群的故障检测和回复的自 动化工作,如RC的定义完成pod的复制或移除;根据Service与Pod的管理关系,完成服务的 Endpoint是对象的创建和更新,如node发现、管理、监控,死亡容器所占磁盘空间及本地缓存的 镜像文件清理等工作。 Scheduler:集群中的调度器,负责Pod在集群节点中的调度分配。
- node
kubelet: 负责本node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时kubelet同时上报kubelet定时上报本node的状态信息到API Server。 Proxy: 实现Service的代理及软件模式的负载均衡器
-
k8s各个组件之间的交互关系:以RC为例
Service、RC(Deployment)、Pod对象如何构成完整的服务
Pod,RC(Deployment)、Service对象如何编写构建 --详见对象编写篇
yml语法
https://blog.csdn.net/wokankanhao88/article/details/97948476Pod
RC
Deployment
https://www.cnblogs.com/ling-yu-amen/p/10956470.htmlService
namespace
spec.limits[].cpu & spec.limits[].memory 限制cpu,mem大小
Pod通信问题
-
Pod内容器之间的通信问题
- 共享卷:操作方式-将共同读、写文件“映射”至宿主机共同目录下。 - 进程间通信(IPC):同Pod下多容器共享同一个IPC命名空间,意味着他们也可以互相使用标准进程间通信,如SystemV信号系统或POSIX共享内存 - 容器间网络通信(UTS):同Pod下多容器共享同一个UTS命名空间,多容器之间可利用localhost:。
-
Pod与Pod间通信:均可使用PodIp:Port形式配置使用
- 两个Pod在同一node上
docker默认的docker网桥互连容器
- 两Pod分布在不同node上;配置PodIp:Port形式
- 官方推荐fannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通信过程走flannel网桥。每个node 上会创建一个flannel虚拟网卡,用于跨node之间通讯。所以容器直接可以直接使用pod id进行通讯。 - 一种方式,为每个Pod创建Service提供服务。
-
Pod中容器与集群外服务通信 -- 存在疑虑,待一起讨论学习
为需要与外部服务通信的Pod创建Service,但不带标签选择器,进行手动创建连接的后端服务(集群外服务) --与Service同名- Endpoint 方法适合外部服务是IP的情况
apiVersion: v1 kind: Service metadata: name: mysql-production spec: ports: - port: 3306 --- kind: Endpoints apiVersion: v1 metadata: name: mysql-production namespace: default subsets: - addresses: - ip: 192.168.1.25 ports: - port: 3306
- tpye:ExternalName
kind: Service apiVersion: v1 metadata: name: svc1 namespace: default spec: type: ExternalName externalName: somedomain.org
-
kubectl 常用管理语法
描述 语法 查看资源信息 kubectl get pods|services|namespaces|nodes|[--all-namespaces|-n NAMESPACE_NAME] 查看资源具体信息 kubectl describe pods|services|namespaces|nodes 获取指定pod容器日志信息 kubectl logs POD_NAME CON_NAME -n NAMESPACE_NAME 创建/删除资源对象 kubectl create|apply/delete -f /PATH/TO/YMLFILE [--validate] 查询集群信息/日志信息 kubectl cluster-info [dump] 获取pod运行在那个节点 kubectl get pods --all-namespaces -o wide