第24周

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 

你可能感兴趣的:(第24周)