K8s详细搭建master-POD守护进程方式

K8s所有运行组件

简单部署方式使用kubeadm  k8s官方发布的简单部署工具。

  1. k8s自己的组件以容器的方式运行在node上
  2. k8s 自己的组件以守护进程的方式运行在系统上

 

master 包括  api server   etcd   controller-manager scheduler  

环境:

Master,etcd:10.80.2.90

Node1:10.80.2.91

Node2:10.80.2.92

前提:

  1. 基于主机名通信:/etc/hosts
  2. 时间同步
  3. 关闭firewalld和IP tables.service

OS:centos 7 extras仓库

安装配置步骤:

  1. etcd cluster ,仅master节点
  2. flannel,集群所有节点
  3. 配置k8s 的master:仅master节点部署kubernetes-master
  4.  启动服务:

 Kube-apiserver,kube-scheduler,kube-controller-manager

  1. 配置K8s的各个node节点,

Kubernetes-node

 先设定启动docker服务;

 启动的k8s服务:

Kube-proxy,kubeletkubeadm

MASTER部署

  1. master,nodes:安装kubelet,kubeadm,docker
  2. master:kubeadm  init 初始化
  3. nodes:kubeadm 加入到集群

 

RPM包安装k8s

然后是RPM包选择阿里云的镜像,地址是:

https://mirrors.aliyun.com/kubernetes/ 

稳定版位置:

https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

上边连接做yum仓库的路径来配置yum源

然后gpgcheck  密钥路径指定位置

https://mirrors.aliyun.com/kubernetes/yum/doc/

 

配置yum仓库

cd /etc/yum.repos.d/

先部署docker仓库:

https://mirrors.aliyun.com/docker-ce/linux/centos/

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

复制连接地址然后

Wget 到/etc/yum.repos.d/下

 

 

 

Kubernetes的仓库手动创建

Vim kubernetes.repo

综上yum源指定完毕,接下来使用命令刷新仓库

yum repolist

然后master上的配置完毕,需要把两个k8s 和docker的repo文件scp到node1  node2 上

 

然后在master上安装yum程序包:

yum install -y kubectl  docker-ce kubelet kubeadm

Kubectl如果是源码安装需要下载上图的位置

以上可以先不是用-y  命令  分别查看各种包的版本

注意kubectl  和kubelet的版本

 

依赖关系也来至于kubernetes的包

如果提示验证检查错误

我们需要把gpgcheck=1 改成0  不检测,然后手动下载yum-key.gpg到本地

还有rpm-package-key.gpg也需要下载到本地

导入key   

Rpm  - -import  yum-key.gpg

rpm - -import  rpm-package-key.gpg

再次使用

yum install -y kubectl  docker-ce kubelet kubeadm

 

安装docker时候报错需要先卸载之前的docker

yum list installed | grep docker

docker version

 yum erase docker

 yum erase docker-common

 yum erase container-selinux

获取key

Wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

rpm --import yum-key.gpg

wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

rpm --import rpm-package-key.gpg导入key

yum install kubelete kubeadm docker-ce kubectl

如果安装过程中报错如下

则需要手动卸载以前的老版本冲突的依赖包

rpm -e kubernetes-client-1.5.2-0.7.git269f928.el7.x86_64卸载

如果提示被kubernetes-master-1.5.2-0.7.git269f928.el7.x86_64依赖 则继续卸载主程序包

rpm -e kubernetes-master-1.5.2-0.7.git269f928.el7.x86_64

并删除备份文件rm -f /etc/kubernetes/apiserver.rpmsave

yum install  kubectl  docker-ce kubelet kubeadm 重新安装即可

 

systemctl start docker启动docker时候报错是因为dockers存储指定配置文件

vim /etc/docker/daemon.json

如果没有json格式的文件或则格式错误,则需要手动修改并添加内容如下:

   {

                       

  "storage-driver"

  :

                       

   "devicemapper"

   }

改变存储设备

Systemctl start docker  启动docker时候

Docker info  会警告存储设备问题  解决办法:

 

在csdn收藏了使用方法存储问题 ,在生产上必须做lvm之后在弄这个。

此处可以忽略警告,继续安装

 

一切就绪之后就用kubeadm  init  初始化

kubeadm init –help  查看命令

 

[root@master system]# kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12

I0121 17:10:19.909579    8467 version.go:94] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled (Client.Timeout exceeded while awaiting headers)

I0121 17:10:19.909790    8467 version.go:95] falling back to the local client version: v1.13.2

[init] Using Kubernetes version: v1.13.2

[preflight] Running pre-flight checks

       [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.09.0. Latest validated version: 18.06

       [WARNING Hostname]: hostname "master.localdomain" could not be reached

       [WARNING Hostname]: hostname "master.localdomain": lookup master.localdomain on 114.114.114.114:53: no such host

error execution phase preflight: [preflight] Some fatal errors occurred:

       [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

       [ERROR Swap]: running with swap on is not supported. Please disable swap

       [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty

[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

[root@master system]#

如果报以上错误则需使用禁用swap错误参数

[root@master /]# cat /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--fail-swap-on=false"添加

 

继续执行kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12

--ignore-preflight-errors=Swap

会提示镜像pull不到,办法(1)是在/usr/lib/systemd/system/docker.service中添加代理

Environment=”NO_PROXY=127.0.0.0/8,10.80.2.90”

办法(2)手动下载镜像,docker pull 下来并改名。

我在此处写了一个脚本k8s.sh,然后执行脚本再修改下载下来的标签即可。

#!/bin/bash

Images=(kube-apiserver:v1.13.2 kube-controller-manager:v1.13.2 kube-scheduler:v1.13.2

kube-proxy:v1.13.2 pause:3.1 etcd:3.2.24)

 

for imageName in ${images[@]} ; do

docker pull mirrorgooglecontainers/$imageName
docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
docker rmi mirrorgooglecontainers/$imageName

done

docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

docker rmi coredns/coredns:1.2.6

脚本执行完成后用docker images 查看脚本标签是否改了过来

如图,没有问题然后继续初始化命令

[root@master ~]# kubeadm init --kubernetes-version=v1.13.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12 --ignore-preflight-errors=Swap

 

保存令牌留作node加入集群命令

kubeadm join 10.80.2.90:6443 --token q7igu9.vwuiakylpgfk01j4 --discovery-token-ca-cert-hash sha256:ca5ea98580d8a5ea66393c5a2504b34fc3f7d75ae972db78552c6e6390970b2d

 

使用netstat 查看服务是否启动如图:

然后查看家目录下是否存在.kube 的目录或则

Mkdir -p $HOME/.KUBE

Cp -i /etc/kubernetes/admin.conf $HOME/.kube/config把配置文件复制到家目录下

至此安装完毕

可以用kubectl get获取相关信息

Kubectl get componentstatus组件状态 就简写为cs

 

Kubectl get cs 

查看状态啊正常,通过自己测试重启reboot后可以 开机自启动没有问题。

[root@master ~]# kubectl get nodes

NAME                 STATUS     ROLES    AGE   VERSION

master.localdomain   NotReady   master   64m   v1.13.2

[root@master ~]#

状态为notready状态是因为master还缺一个网络组件flannel。

https://github.com/coreos/flannel   github的地址为

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

可以看到flannel镜像已经下载完

 

然后查看nodes状态

Kubectl get nodes  如图

已经是ready状态

然后通过kubectl get pods -n kube-system查看 pod中flannel是否运行起来的状态

Kubenetes有三个命名空间namespace  -n参数指定命名空间来查看pods

 

NODES节点部署

Yum 配置

yum安装需要的nodes节点需要的包

此处node的yum配置跟master是一样的

然后把需要的配置文件scp到本地相应位置,与master一样。

可以在node1和node2分别用下边命令执行

scp [email protected]:/root/rpm-package-key.gpg  /root/

scp [email protected]:/root/yum-key.gpg  /root/

[email protected]:/usr/lib/systemd/system/docker.service  /usr/lib/systemd/system/docker.service

scp [email protected]:/etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/

scp [email protected]:/etc/yum.repos.d/kubernetes.repo /etc/yum.repos.d/

 

然后导入gpg验证

rpm --import /root/rpm-package-key.gpg

rpm --import /root/yum-key.gpg

yum repolist 查看是否导入了阿里云的源

yum install -y docker-ce kubelet kubeadm

有一点需要注意

scp [email protected]:/etc/sysconfig/kubelet /etc/sysconfig/kubelet

需要在kubelet安装完之后copy过来 或则自己手动更改

[root@master ~]# cat /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--fail-swap-on=false"

 

还需要确定

[root@master ~]# cat /etc/docker/daemon.json

{

"storage-driver"

:                      

"devicemapper"

}

[root@master ~]#

echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

确定开启了转发功能iptables

接下来安装成功后,先启动docker ,加载之前的配置

systemctl daemon-reload

systemctl start docker

docker info  查看docker 状态

systemctl enable docker kubelet   开机自启

执行k8s.sh脚本下载所需node节点的容器镜像

#!/bin/bash

images=(kube-proxy:v1.13.2 pause:3.1)

for imageName in ${images[@]} ; do

docker pull mirrorgooglecontainers/$imageName

docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName

docker rmi mirrorgooglecontainers/$imageName

done

docker pull coredns/coredns:1.2.6

docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

docker rmi coredns/coredns:1.2.6

docker pull registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64         docker tag registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64

 

此处flannel需要手动下载

[root@localhost ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64

从quay.io和gcr.io进行镜像拉取,我们知道,国内访问外网是被屏蔽了的。可以将其替换为 quay-mirror.qiniu.com 和 registry.aliyuncs.com

例如

下拉镜像:quay.io/coreos/flannel:v0.10.0-s390x

如果拉取较慢,可以改为:quay-mirror.qiniu.com/coreos/flannel:v0.10.0-s390x

 

下拉镜像:gcr.io/google_containers/kube-proxy

可以改为: registry.aliyuncs.com/google_containers/kube-proxy

 

然后现在就开始把node加入到集群命令是之前生成的

kubeadm join 10.80.2.90:6443 --token q7igu9.vwuiakylpgfk01j4 --discovery-token-ca-cert-hash sha256:ca5ea98580d8a5ea66393c5a2504b34fc3f7d75ae972db78552c6e6390970b2d --ignore-preflight-errors=Swap

执行上边命令后

在master上查看节点是否加入

[root@master ~]# kubectl get nodes

NAME                 STATUS   ROLES    AGE     VERSION

master.localdomain   Ready    master   6h27m   v1.13.2

node1.localdomain    Ready    <none>   43m     v1.13.2

node2.localdomain    Ready    <none>   106s    v1.13.2

至此,所有的master和node都已经安装完成并加入到了集群。

集群命令kubelet

kubectl describe node master 描述master信息

kubectl cluster-info 集群信息包括IP地址coredns

kubectl version 版本信息  client版本  server版本

怎么使用kubernetes

K8s最小调动单位是pod

kubectl run –help  Create and run a particular image, possibly replicated.创建并运行一个特定的镜像,一副本形式运行。

 

Usage:

  kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool]

[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]

 

栗子创建pod

root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

deployment.apps/nginx-deploy created (dry run)

以dry-run模式创建,并没有实际创建pod

--image 指定镜像  --port 指定端口  --replicas 指定副本数量 pod数量

当去掉--dry-run=true 选项时候即为真是创建了pod

查看创建的pod的命令:

kubectl get pods 或者 kubectl get deployment

kubectl get pods -o wide 显示更详细信息  包括pod的IP地址

通过上边的命令已经获取到了所部署的容器的服务名称IP地址启动状态等,接下来根据其IP地址在nonde1上访问下是否能访问到nginx的页面。如下图:

[root@node1 ~]# curl 10.244.2.2

通过此处的IP10.244.2.2在集群外部浏览器是无法打开的,说明通过pod网络地址只能在集群内部访问,如过需要外部访问,还需要service地址跟node转发。

但是pod的IP是不稳定的,当删除pod时候根据副本控制器replicas=1会重新创建一个新的,如图IP地址已经更改。

所以,要想访问pod的服务,需要找到一个固定的端点servcie  IP 来替代。

创建service

命令  kubectl expose(暴露)--help  此处为创建的意思

Usage:

  kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]

[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]

[root@master ~]# kubectl get pods

NAME                            READY   STATUS    RESTARTS   AGE

nginx-deploy-84cbfc56b6-jx8gt   1/1     Running   0          19m

[root@master ~]# kubectl get deployment

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   1/1     1            1           58m

创建service

[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80

service/nginx exposed

[root@master ~]# kubectl get svc (services)

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE

kubernetes   ClusterIP   10.240.0.1      <none>        443/TCP   25h

nginx        ClusterIP   10.245.13.107   <none>        80/TCP    38s

通过clusterip可以在node上来访问,但是还是无法正在集群外部访问,通常serviceIP是为pod提供的固定访问地址。

另外通过service服务名称也可以来访问nginx,需要coredns来解析域名关系

 

[root@master ~]# kubectl get pods -n kube-system -o wide

NAME                                         READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES

coredns-86c58d9df4-2dvfl                     1/1     Running   0          28h   10.244.0.4   master.localdomain   <none>           <none>

coredns-86c58d9df4-5t9p6                     1/1     Running   0          28h   10.244.0.2   master.localdomain   <none>           <none>

etcd-master.localdomain                      1/1     Running   1          28h   10.80.2.90   master.localdomain   <none>           <none>

kube-apiserver-master.localdomain            1/1     Running   1          28h   10.80.2.90   master.localdomain   <none>           <none>

kube-controller-manager-master.localdomain   1/1     Running   2          28h   10.80.2.90   master.localdomain   <none>           <none>

kube-flannel-ds-amd64-5kmqb                  1/1     Running   0          26h   10.80.2.90   master.localdomain   <none>           <none>

kube-flannel-ds-amd64-8prsw                  1/1     Running   1          21h   10.80.2.92   node2.localdomain    <none>           <none>

kube-flannel-ds-amd64-t5zm9                  1/1     Running   1          22h   10.80.2.91   node1.localdomain    <none>           <none>

kube-proxy-g2c6v                             1/1     Running   1          28h   10.80.2.90   master.localdomain   <none>           <none>

kube-proxy-kcdgv                             1/1     Running   0          22h   10.80.2.91   node1.localdomain    <none>           <none>

kube-proxy-mf4mq                             1/1     Running   0          21h   10.80.2.92   node2.localdomain    <none>           <none>

kube-scheduler-master.localdomain            1/1     Running   2          28h   10.80.2.90   master.localdomain   <none>           <none>

[root@master ~]# kubectl get svc -n kube-system

NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE

kube-dns   ClusterIP   10.240.0.10   <none>        53/UDP,53/TCP   28h

[root@master ~]#  此处为kube-dns自己的地址所以需要指定这个地址来解析nginx

这里使用10.240.0.10 kube-dns 在解析

yum install -y bind-utils 

 

dig -t A nginx.default.svc.cluster.local @10.240.0.10  其中nginx.default.svc.cluster.local 是本地pod解析域,可以在创建pod时候使用 -i -t 选项直接进入pod的交互式

cat /etc/resolv.conf  查看

上图箭头指向为解析出来的IP与上边获取到的IP一致。

 

使用service名称解析是在pod内部,需要登陆到内部才可以直接访问

 

[root@master mapper]# kubectl describe svc nginx

Name:              nginx

Namespace:         default

Labels:            run=nginx-deploy

Annotations:       <none>

Selector:          run=nginx-deploy

Type:              ClusterIP

IP:                10.245.13.107

Port:              <unset>  80/TCP

TargetPort:        80/TCP

Endpoints:         10.244.1.2:80

Session Affinity:  None

Events:            <none>

[root@master mapper]#  详细描述nginx服务service的详细信息。

如果pod的资源被挡掉或则被删掉。对应的endpoints 地址就会更换掉。

[root@master mapper]# kubectl get pods --show-labels

NAME                            READY   STATUS    RESTARTS   AGE    LABELS

nginx-deploy-84cbfc56b6-jx8gt   1/1     Running   0          4h6m   pod-template-hash=84cbfc56b6,run=nginx-deploy

显示标签

 

Kubectl edit svc nginx   编辑service 显示ymal格式的文件包阔IP 端口  name

也可以编辑

kubectl get deployment -w -w选项显示的是一直监听的状态

 

改变副本数量命令

Usage:

  kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)

[options]

栗子:

[root@master mapper]# kubectl get deployment

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   1/1     1            1           5h24m

[root@master mapper]# kubectl scale --replicas=2 deployment nginx-deploy

deployment.extensions/nginx-deploy scaled

 [root@master mapper]# kubectl get deployment

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   2/2     2            2           5h25m

[root@master mapper]#

 

更改pod容器版本命令

Kubectl set –help  查看命令格式

Usage:

  kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

[options]

更改镜像版本

Kubectl set image deployment myapp myapp=ikubernetes/myapp:v2

查看滚动升级的状态

Kubectl rollout status deployment nginx

 

回滚命令

Kubectl rollout undo deployment nginx

iptables -vnL -t nat 命令

集群内部网络通信是通过ipvs

如果集群外部访问需要更改service的type类型为NodePort

Kubectl edit svc nginx

如图服务类型变成了nodport  端口映射到了32647

然后我们来访问试试

[root@master ~]# kubectl exec -it nginx-deploy  -c nginx-deploy -- /bin/sh

可以直接进入到容器进行配置

 

 

猜你喜欢

转载自blog.csdn.net/weixin_43231324/article/details/86644792