1、描述zookeeper集群中leader,follower,observer几种角色
leader
leader节点是zookeeper集群的主节点,由选举产生。主要负责所有的写请求,也处理读请求。还维持与从节点,即follower节点和observer节点的心跳,从而实时监测从节点的运作情况和通知从节点自身的运作情况。
follower
follower节点是zookeeper集群的从节点,参与leader选举。当主节点宕机后,可以被选举为主节点。主要负责处理客户端的读请求,对于写请求则首先统一转发给leader节点,然后在leader节点执行写请求时,会将写请求以proposal的方式发送给向所有follower节点,投票来决定是否需要执行此次写请求,所以follower节点需要ack响应leader节点来进行投票。如果投票通过,则leader向所有的follower和observer节点发送提交commit请求,从而在所有节点执行本次数据写操作。
observer
observer节点主要处理读请求,对于写请求则统一转发给leader节点。observer节点没有投票权,不参与leader节点发起的写请求的投票和leader选举的投票,只是从leader节点同步数据,处理读请求,所以observer节点主要是对zookeeper集群的读请求的拓展。
2、完成zookeeper分布式集群的搭建
yum install java
vim /etc/profile.d/java.sh
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
exec bash
java -version
tar xvf /root/zookeeper-3.4.14.tar.gz /usr/local/
cd /usr/local
ln -sv zookeeper-3.4.14 zookeeper
chowm -R root:root zookeeper-3.4.14
cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/data/zookeeper
dataLogDir=/data/zookeeper/log
server.1=192.168.0.113:2888:3888
server.2=192.168.0.114:2888:3888
server.3=192.168.0.143:2888:3888
mkdir -p /data/zookeeper
mkdir -p /data/zookeeper/log
vim /data/zookeeper/myid ##三台电脑,序号跟上面server号相对应。server.1 就填 1 ,server.2 就填 2
1
bash /usr/local/zookeeper/bin/zkServer.sh start
cd ../bin/
./zkCli.sh -h 192.168.0.113:2181
create /test "test"
ls /
get /test
stat /test
delete /test 单目录删除
rmr /test 递归删除
create -e /test "test" 临时节点不能有子节点
3、总结kubernetes几个重要组件以及组件的作用
Master组件:
apiserver
所有服务访问的统一入口,各组件协调者,以HTTP API提供接口服务。所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
controller-manager
维持副本期望数目。处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
scheduler
负责介绍任务,选择合适的节点进行分配任务。根据调度算法为新创建的Pod选择一个Node节点。
Node组件:
Kubelet
Kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。Kubelet将每个Pod转换成一组容器。
Kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。将规则写入iptables,ipvs。实现服务映射访问
container runtime
运行容器(docker,rkt,cri-o,frakti)
第三方组件:
Etcd
分布式键值存储系统。用于存储集群所有重要信息(持久化),比如Pod、Service等对象信息。
flannel
实现跨主机的容器网络的通信
coredns
为集群的svc创建一个域名IP的对应关系解析
bashboard
为集群提供图形化界面
ingress controller
实现七层代理,官方的只能实现四层
federation
提供一个可以跨集群多k8s统一管理功能
prometheus
提供监控功能
elk
提供统一日志分析平台
4、安装部署Kubernetes集群
统一部署环境需求:master:1台 node:2台 ###生产环境master建议3台,etcd必需3台以上(单数),worker根据业务来判断;master配置8核16G,100G ;worker配置16核64G(越大越好),500G
systemctl restart chronyd ##3台,保证时间一致
vim /etc/hosts ##添加3台解析,或用dns服务器
192.168.0.108 master
192.168.0.109 node1
192.168.0.111 node2
关闭防火墙,selinux,swap(vim /etc/fstab 注释掉swap)
准备好安装源,及kubeadm,kubectl,kubelet的1.13.3安装包,及对应版本的1.13.3的k8s的docker镜像。docker每台都安装(配置国内--阿里源)
master节点:
yum install docker-ce
vim /usr/lib/systemd/system/docker.service ##添加几项
Environment="HTTPS_PROXY=http://www.ik8s.io:10070" ##可以不加,连不到服务器
Environment="NO_PROXY=127.0.0.0/8,172.18.0.0/16" ##可以不加,连不到服务器
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload
systemctl start docker
systemctl enable docker
vim /etc/sysctl.d/k8s.conf ##修改bridge-iptables等于1;3台都要
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward = 1
vm.swappiness = 0
modprobe br_netfilter ### 3台都要
lsmod | grep br_netfilter ### 3台都要
sysctl -p /etc/sysctl.d/k8s.conf ### 3台都要
yum -y install ipset ipvsadm ### 可选安装 ipset,代替iptables
cat > /etc/sysconfig/modules/ipvs.modules <
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules ### 3台都要
bash /etc/sysconfig/modules/ipvs.modules ### 3台都要
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 ### 3台都要
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
添加k8s的国内--阿里源(yum源)
yum install -y kubelet kubeadm kubectl
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
kubeadm init --kubernetes-version="v1.13.3" --dry-run --ignore-preflight-errors=Swap ##先试运行看看有没有错误
### kubeadm init --kubernetes-version="v1.13.3" --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.216.100 (192.168.216.100 当前master主机地址;前面是网络组件)
systemctl enable kubelet
kubeadm config images list ##查看需要k8s的组件版本
docker image list ##查看docker的镜像列表
docker load -i k8s-master-v1.13.3.tar ##载入镜像列表
kubeadm init --kubernetes-version="v1.13.3" --ignore-preflight-errors=Swap ##初始化
mkdir -p $HOME/.kube ##正式环境应该建立一个普通用户,测试就用root。初始化结尾里有命令语句,及node加入master的命令。
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ##安装flannel网络组件 或者 calico 网络组件
node1和2节点:
yum install docker-ce
yum install kubelet kubeadm
systemctl enable kubelet
systemctl enable docker
回到master节点:
scp /etc/yum.repos.d/kubernetes.repo node1:/etc/yum.repos.d/
scp /etc/yum.repos.d/kubernetes.repo node2:/etc/yum.repos.d/
scp /etc/sysconfig/kubelet node1:/etc/sysconfig/
scp /etc/sysconfig/kubelet node2:/etc/sysconfig/
scp /etc/hosts node1:/etc/
scp /etc/hosts node2:/etc/
scp /etc/sysctl.d/k8s.conf node1:/etc/sysctl.d/
scp /etc/sysctl.d/k8s.conf node2:/etc/sysctl.d/
node1和2节点:
kubeadm join 192.168.0.108:6443 --token gp4pn5.fo27fnyklqtj8lg0 --discovery-token-ca-cert-hash sha256:bcc11b66bb7d3ae6c3b7d3688a49295b251f28fe2ecb73e91b9079fdc8899808 --ignore-preflight-errors=Swap
docker load -i k8s-node-v1.13.3.tar
回到master:
kubectl get nodes ##node1和2已添加,ready 状态
scp /etc/kubernetes/admin.conf node1:/root/.kube/config ##有此文件,任一节点可以使用kubectl命令
scp /etc/kubernetes/admin.conf node2:/root/.kube/config
查看集群健康状态:
kubectl get cs
kubectl cluster-info
kubectl 创建 namespace 空间:
kubectl create namespace test
kubectl get namespace
cat 01-create-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demons1
kubectl apply -f 01-create-ns.yaml
kubectl delete namespace test ### 删除namespace时,命名空间中包含的所有资源对象同时被删除
kubectl delete -f 01-create-ns.yaml
kubectl get pod -n kube-system
cat 02-create-pod.yaml ### pod 是k8s集群可以调度的最小单元
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginxport
containerPort: 80
kubectl apply -f 02-create-pod.yaml
kubectl get pods
kubectl get pods -n default
kubectl get pods -o wide
pod 访问:
curl http://192.168.0.10
删除pod:
kubectl delete pods pod1 -n default
kubectl delete -f 02-create-pod.yaml
通过 kubectl 创建 deployment 控制型应用
kubectl run nginx-app --image=nginx:latest -image-pull-policy=IfNotPresent --replicas=2 ### nginx-app 是 deployment 控制器类型的应用名称;nginx:latest 是应用运行的pod中的container所使用的镜像;IfNotPresent 是 container 容器镜像下载的策略,如果本地有镜像使用本地,如果本地没有则下载;--replicas=2 是指应用运行的 pod 共计2个副本;deployment 控制器中的 replicaset 控制器会一直监控此应用运行的 pod 副本状态,如果数量达不到用户期望,就会重新拉起一个新的pod ,让 pod 数量一直维持在用户期望数量
kubectl get deployment.apps
kubectl get replicaset.apps
cat 03-create-deployment-nginx-app2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app2
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp2-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginxapp2
containerPort: 80
kubectl apply -f 03-create-deployment-nginx-app2.yaml
kubectl get rs
带有控制器类型的 pod 不能随意删除,如果必须删除,请删除控制器类型的应用名称
kubectl delete pods nginx-app1-*******-****** -n default
kubectl get deployment.apps
kubectl delete deployment.apps nginx-app1 ###通过kubectl get deployment.apps 查看后再删除
kubectl delete -f 03-create-deployment-nginx-app2.yaml ###通过kubectl get deployment.apps 查看
service不是实体服务;是一条iptables或ipvs转发规则;通过service为pod客户端提供访问pod方法,即客户端访问pod入口;service通过pod标签与pod进行关联
service类型:
clusterIP:默认,分配一个集群内部可以访问的虚拟IP
nodeport:在每个node上分配一个端口作为外部访问入口
loadbalancer:工作在特定的cloud provider上,例如google cloud,aws,openstack
externalname:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
kubectl run nginx-app1 --image=nginx:latest -image-pull-policy=IfNotPresent --replicas=1
创建service 与 deployment 类型应用关联:
kubectl expose deployment.apps nginx-app1 --type=ClusterIP --target-port=80 --port=80
## expose 创建 service ;deployment.apps控制器类型;nginx-app1 应用名称,也是service名称;--type=ClusterIP 指定service 类型;--target-port=80 指定pod中容器端口;--port=80指service端口
kubectl get service / kubectl get svc
kubectl get endpoints
kubectl get pods -o wide
cat 04-create-deployment-nginx-app2-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app2
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp2
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app2-svc
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
apps: nginx
kubectl apply -f 04-create-deployment-nginx-app2-service.yaml
kubectl exec -it nginx-app2-*****-*** bash
kubectl apply -f 05-create-deployment-nginx-app3-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app3
spec:
replicas: 2
selector:
matchLabels:
app: nginx-app3
template:
metadata:
labels:
app: nginx-app3
spec:
containers:
- name: nginxapp3
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app3-svc
spec:
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30001 ## 从30000开始,可以不写,会自动生成
selector:
apps: nginx-app3
kubectl delete service nginx-app1
kubectl delete -f 05-create-deployment-nginx-app3-service.yaml