SpringCloud--17微服务的部署(服务编排2)

1.部署CalicoNode(所有节点)

5.1 简介

Calico实现了CNI接口,是kubernetes网络方案的一种选择,它一个纯三层的数据中心网络方案(不需要Overlay),并且与OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。 Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。

5.2 部署

calico是通过系统服务+docker方式完成的

$ cp target/all-node/kube-calico.service /lib/systemd/system/
$ systemctl enable kube-calico.service
$ service kube-calico start
$ journalctl -f -u kube-calico

 现在主节点上完成:

 

 配置文件:

Description=calico node
After=docker.service
Requires=docker.service

[Service]
User=root
PermissionsStartOnly=true
ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \
  -e ETCD_ENDPOINTS=http://192.168.237.134:2379 \
  -e CALICO_LIBNETWORK_ENABLED=true \
  -e CALICO_NETWORKING_BACKEND=bird \
  -e CALICO_DISABLE_FILE_LOGGING=true \
  -e CALICO_IPV4POOL_CIDR=172.20.0.0/16 \
  -e CALICO_IPV4POOL_IPIP=off \
  -e FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT \
  -e FELIX_IPV6SUPPORT=false \
  -e FELIX_LOGSEVERITYSCREEN=info \
  -e FELIX_IPINIPMTU=1440 \
  -e FELIX_HEALTHENABLED=true \
  -e IP=192.168.237.134 \
  -v /var/run/calico:/var/run/calico \
  -v /lib/modules:/lib/modules \
  -v /run/docker/plugins:/run/docker/plugins \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/log/calico:/var/log/calico \
  registry.cn-hangzhou.aliyuncs.com/imooc/calico-node:v2.6.2
ExecStop=/usr/bin/docker rm -f calico-node
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

  重点配置说明:

[Unit]
Description=calico node
...
[Service]
#以docker方式运行
ExecStart=/usr/bin/docker run --net=host --privileged --name=calico-node \
#指定etcd endpoints(这里主要负责网络元数据一致性,确保Calico网络状态的准确性)
-e ETCD_ENDPOINTS=http://192.168.1.102:2379 \
#网络地址范围(同上面ControllerManager)
-e CALICO_IPV4POOL_CIDR=172.20.0.0/16 \
#镜像名,为了加快大家的下载速度,镜像都放到了阿里云上
registry.cn-hangzhou.aliyuncs.com/imooc/calico-node:v2.6.2

 5.3 calico可用性验证

docker ps  因为他要去拉镜像,起容器,这个过程还是要等好一会儿

  

  欧克,其他两个从节点也可以按照如上的方式安装,没有什么问题

  查看节点运行情况 calicoctl node status

   

2.配置kubectl命令(任意节点)这里装在了主节点

2.1 简介

kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。 kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能。

2.2 初始化

使用kubectl的第一步是配置Kubernetes集群以及认证方式,包括:

  • cluster信息:api-server地址
  • 用户信息:用户名、密码或密钥
  • Context:cluster、用户信息以及Namespace的组合

我们这没有安全相关的东西,只需要设置好api-server和上下文就好啦:

#指定apiserver地址(ip替换为你自己的api-server地址)  设置当前的cluster的名字为kubernetes
kubectl config set-cluster kubernetes  --server=http://192.168.237.134:8080
#指定设置上下文,也叫kubernetes,指定cluster  
kubectl config set-context kubernetes --cluster=kubernetes
#选择默认的上下文
kubectl config use-context kubernetes

 

 如何验证是否配置成功了呢?可以运行命令:

  

3. 配置kubelet(工作节点 node 5和node 6)

3.1 简介

每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。

3.2 部署

通过系统服务方式部署,但步骤会多一些,具体如下:

#确保相关目录存在
$ mkdir -p /var/lib/kubelet
$ mkdir -p /etc/kubernetes
$ mkdir -p /etc/cni/net.d

#复制kubelet服务配置文件
$ cp target/worker-node/kubelet.service /lib/systemd/system/
#复制kubelet依赖的配置文件
$ cp target/worker-node/kubelet.kubeconfig /etc/kubernetes/
#复制kubelet用到的cni插件配置文件
$ cp target/worker-node/10-calico.conf /etc/cni/net.d/

$ systemctl enable kubelet.service
$ service kubelet start
$ journalctl -f -u kubelet

  重点配置说明:

kubelet.service

[Unit]
Description=Kubernetes Kubelet
[Service]
#kubelet工作目录,存储当前节点容器,pod等信息
WorkingDirectory=/var/lib/kubelet
ExecStart=/home/michael/bin/kubelet \
#对外服务的监听地址
--address=192.168.1.103 \
#指定基础容器的镜像,负责创建Pod 内部共享的网络、文件系统等,这个基础容器非常重要:K8S每一个运行的 POD里面必然包含这个基础容器,如果它没有运行起来那么你的POD 肯定创建不了
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/imooc/pause-amd64:3.0 \
#访问集群方式的配置,如api-server地址等
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
#声明cni网络插件
--network-plugin=cni \
#cni网络配置目录,kubelet会读取该目录下得网络配置
--cni-conf-dir=/etc/cni/net.d \
#指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster-domain 指定域名后缀,这两个参数同时指定后才会生效
--cluster-dns=10.68.0.2 \
...

kubelet.kubeconfig
kubelet依赖的一个配置,格式看也是我们后面经常遇到的yaml格式,描述了kubelet访问apiserver的方式

apiVersion: v1
clusters:
- cluster:
#跳过tls,即是kubernetes的认证
insecure-skip-tls-verify: true
#api-server地址
server: http://192.168.1.102:8080
...

10-calico.conf
calico作为kubernets的CNI插件的配置

{  
  "name": "calico-k8s-network",  
  "cniVersion": "0.1.0",  
  "type": "calico",  
    <!--etcd的url-->
    "ed_endpoints": "http://192.168.1.102:2379",  
    "logevel": "info",  
    "ipam": {  
        "type": "calico-ipam"  
   },  
    "kubernetes": {  
        <!--api-server的url-->
        "k8s_api_root": "http://192.168.1.102:8080"  
    }  
}  

 两台工作节点装上之后,确认一下是否好用:

  

  ok 没有问题

 至此,K8S集群就搭建完毕了,接下就是要在这个集群上做一些测试和练习

 1.查看kubectl的版本

kubectl version

  

2.获取所有的节点信息

kubectl get nodes

  

 3.获取pods

kubectl get pods

  

4. 运行一个官方的容器看看

kubectl  run kubernetes-bootcamp  --image=docker.io/jocatalin/kubernetes-bootcamp:v1  --port=8080

  期望的pod是1,实际上也是1,但是可获得的是0

 

 查看pod的具体信息

 如果出错了 可以通过命令journalctl -f 查看系统日志

 删除deplodeyments

5.查看deplodeyments的详细信息

kubectl describe deploy kubernetes-bootcamp

  

同样也可以查看pod的详细信息

6.扩缩容  把部署扩容成三个副本

kubectl  scale deploy kubernetes-bootcamp  --replicas=3

  

 

7.更新镜像

kubectl  set  image  deployments/kubernetes-bootcamp  kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

 查看更新结果:

kubectl  rollout  status  deployments/kubernetes-bootcamp

  更新镜像后发现他重新计算了pod运行的节点。

 8.回滚上一个操作

kubectl  rollout  undo  deployments/kubernetes-bootcamp

  ok 以上都是通过命令来操作k8s集群的,但是,当我们的应用多了以后用命令显然不方便所以我们会用配置文件的方式。

  我们写一个创建pod的配置文件,这个pod里面有一个nginx的容器

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

好了,创建pod的命令:

kubectl create -f nginx-pod.yaml

 

可以看到创建pod就只是创建pod,并不会去创建deploy.

可以看到这个nginx的pod是在node6上面去运行起来了

ok ,现在我们要怎么去访问呢?我们访问这个pod

  

  然后访问:

curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/nginx/

ok,上面我们创建了一个pod,现在我们来创建一个deployment,

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

根据lable过滤pod

4.为集群增加service功能 - kube-proxy(工作节点)

3.1 简介

每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群外可以被访问到的重要方式。

3.2 部署

通过系统服务方式部署:

#确保工作目录存在
$ mkdir -p /var/lib/kube-proxy
#复制kube-proxy服务配置文件
$ cp target/worker-node/kube-proxy.service /lib/systemd/system/
#复制kube-proxy依赖的配置文件
$ cp target/worker-node/kube-proxy.kubeconfig /etc/kubernetes/

$ systemctl enable kube-proxy.service
$ service kube-proxy start
$ journalctl -f -u kube-proxy

配置文件:

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/root/bin/kube-proxy \
  --bind-address=192.168.237.134 \
  --hostname-override=192.168.237.134 \
  --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
  --logtostderr=true \
  --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

3.3 重点配置说明

kube-proxy.service

[Unit]
Description=Kubernetes Kube-Proxy Server ...
[Service]
#工作目录
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/home/michael/bin/kube-proxy \
#监听地址
--bind-address=192.168.1.103 \
#依赖的配置文件,描述了kube-proxy如何访问api-server
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
...

kube-proxy.kubeconfig 配置了kube-proxy如何访问api-server,内容与kubelet雷同,不再赘述。

apiVersion: v1
clusters:
- cluster:
    server: http://192.168.237.134:8080
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
  name: default
current-context: default
kind: Config
preferences: {}
users: []

3.4 操练service

刚才我们在基础集群上演示了pod,deployments。下面就在刚才的基础上增加点service元素。

 1.查看service

kubectl get services

 

  现在还看不到工作节点的services,因为我们还没有暴露出来,下面暴露一下再访问

kubectl expose deploy kubernetes-bootcamp --type="NodePort" --target-port=8080 --port=80

  可以发现这个pod有一个端口映射,从80,映射到了37021,这个其实是在工作节点上映射的,而不是我们的master节点上映射的。target.port是当前容器,当前pod真正监听的端口, 80这个端口是可以通过Cluster-ip去访问服务的端口。 进入容器内部可以使用Cluster-ip加服务端口的方式访问容器,也可以使用pod容器的ip加容器的端口的方式访问容器。

ok,所以啊,可以通过节点的ip 配合节点上自动分配的随机端口37021去访问pod,访问服务,但是访问不到,

ok ,去节点看端口35855,有没有被监听器来,netstat -ntlp |grep 35855,没有,然后猜想是kube-proxy组件出了问题,ok,去看看日志

根据这个日志找到原因:iptables版本问题,降低一下他的版本就好了

1.卸载原iptables  这会把docker也卸载了,所以安装的时候后安dockers
yum remove iptables

安装:

rpm -ivh iptables-1.4.21-18.0.1.el7.centos.x86_64.rpm

重启kube-proxy:

 systemctl restart kube-proxy

查看日志正常:

 

再访问:ok没有问题能够访问到

卸载老的iptables包时卸载了相关依赖包,按照卸载的包重新装回来。yum -y install <>防火墙的没有装

 

接下来我们使用配置文件的方式创建services,使他的一些配置都固定下来

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 20000
  selector:
    app: nginx
  type: NodePort

 port就是service 的port ,Cluster-ip对应的port, targetPort容器的端口,具体的nginx服务所对应的端口,nodePort:节点上对应的端口,对这个集群外部提供服务的端口。好了同样的命令

 

5. 为集群增加dns功能 - kube-dns(app)

5.1 简介

kube-dns为Kubernetes集群提供命名服务,主要用来解析集群服务名和Pod的hostname。目的是让pod可以通过名字访问到集群内服务。它通过添加A记录的方式实现名字和service的解析。普通的service会解析到service-ip。headless service会解析到pod列表。

5.2 部署

通过kubernetes应用的方式部署 kube-dns.yaml文件基本与官方一致(除了镜像名不同外)。 里面配置了多个组件,之间使用”---“分隔

#到kubernetes-starter目录执行命令
$ kubectl create -f target/services/kube-dns.yaml

  kube-dns.yam文件:

---
#ConfigMap是我们见到的一个新类型,顾名思义是做配置管理的,这里用作kube-dns配置存储
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists

---
#认证授权使用,这里未用到
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    addonmanager.kubernetes.io/mode: Reconcile

---
#dns服务
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    addonmanager.kubernetes.io/mode: Reconcile
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    #选择器,一个服务包含了哪些pods
    k8s-app: kube-dns
  #服务的clusterip,需要跟kubelet保持一致
  clusterIP: 10.68.0.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

---
#具体的pod定义,包含了三个容器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  strategy:
    rollingUpdate:
      maxSurge: 10%
      maxUnavailable: 0
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      volumes:
      - name: kube-dns-config
        configMap:
          name: kube-dns
          optional: true
      containers:
      #实现dns解析功能
      - name: kubedns
        image: registry.cn-hangzhou.aliyuncs.com/imooc/k8s-dns-kube-dns-amd64:1.14.5
        resources:
          # TODO: Set memory limits when we've profiled the container for large
          # clusters, then set request = limit to keep this container in
          # guaranteed class. Currently, this container falls into the
          # "burstable" category so the kubelet doesn't backoff from restarting it.
          limits:
            memory: 170Mi
          requests:
            cpu: 100m
            memory: 70Mi
        livenessProbe:
          httpGet:
            path: /healthcheck/kubedns
            port: 10054
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /readiness
            port: 8081
            scheme: HTTP
          # we poll on pod startup for the Kubernetes master service and
          # only setup the /readiness HTTP server once that's available.
          initialDelaySeconds: 3
          timeoutSeconds: 5
        args:
        - --domain=cluster.local.
        - --dns-port=10053
        - --config-dir=/kube-dns-config
        #访问kube-apiserver的地址
        - --kube-master-url=http://{{MASTER_IP}}:8080
        - --v=2
        env:
        - name: PROMETHEUS_PORT
          value: "10055"
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
        - containerPort: 10055
          name: metrics
          protocol: TCP
        volumeMounts:
        - name: kube-dns-config
          mountPath: /kube-dns-config
      #dnsmasq类似一个dns缓存,用于提高访问效率
      - name: dnsmasq
        image: registry.cn-hangzhou.aliyuncs.com/imooc/k8s-dns-dnsmasq-nanny-amd64:1.14.5
        livenessProbe:
          httpGet:
            path: /healthcheck/dnsmasq
            port: 10054
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        args:
        - -v=2
        - -logtostderr
        - -configDir=/etc/k8s/dns/dnsmasq-nanny
        - -restartDnsmasq=true
        - --
        - -k
        - --cache-size=1000
        - --log-facility=-
        - --server=/cluster.local./127.0.0.1#10053
        - --server=/in-addr.arpa/127.0.0.1#10053
        - --server=/ip6.arpa/127.0.0.1#10053
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        # see: https://github.com/kubernetes/kubernetes/issues/29055 for details
        resources:
          requests:
            cpu: 150m
            memory: 20Mi
        volumeMounts:
        - name: kube-dns-config
          mountPath: /etc/k8s/dns/dnsmasq-nanny
      #sidecar是一个监控功能,负责监控另外两个容器的运行
      - name: sidecar
        image: registry.cn-hangzhou.aliyuncs.com/imooc/k8s-dns-sidecar-amd64:1.14.5
        livenessProbe:
          httpGet:
            path: /metrics
            port: 10054
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        args:
        - --v=2
        - --logtostderr
        - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,A
        - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,A
        ports:
        - containerPort: 10054
          name: metrics
          protocol: TCP
        resources:
          requests:
            memory: 20Mi
            cpu: 10m
      dnsPolicy: Default  # Don't use cluster DNS.
      serviceAccountName: kube-dns

  

 

  看看成功了没有:

kubectl -n kube-system get services

 

 然后在命名空间下查看pod

 完了,没起来,找一下原因,看看dns 容器

可以看到有dns容器退出的,看看容器的日志

ok,应该是配置文件的问题

在kube-system的命名空间下,把创建的那些配置全部删除,然后替换配置文件种自动无法替换的变量,重新生成配置

ok,现在pod全部能运行

欧克,添加了dns组件以后有什么效果呢?

我们进到一个容器里面,先看看有哪些services:

通过名字访问 nginx 服务:

DNS 提供了解析的功能,把services的名字解析成了ClusterIP。

那么如何停掉dns呢?

kubectl delete -f target/services/kube-dns.yaml

5.3 重点配置说明

请直接参考配置文件中的注释。

5.4 通过dns访问服务

这了主要演示增加kube-dns后,通过名字访问服务的原理和具体过程。演示启动dns服务和未启动dns服务的通过名字访问情况差别。 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值