centos 7 安装 kubernetes

1、参考文章

https://blog.51cto.com/3241766/2405624

(这个文章写的条理挺好的,但是其中有好几个地方会存在一些问题,在此文章最后面已经写明,可以参考一下)

https://www.cnblogs.com/Erik_Xu/p/8783789.html

 

2、软件版本相关概览

 Centos 7.6安装参考:

https://www.cnblogs.com/zhuzi91/p/12356856.html 

 

安装步骤包含如下部分

1、docker 安装(两个节点都要执行)

2、k8s 安装准备工作(两个节点都要执行)

3、Master 节点安装

4、Node 节点安装

5、DashBoard 安装(这个部分浏览器访问的时候一直不出来,暂时还不知道是什么原因)

6、集群测试

 

1、Docker 安装(两个节点都要执行)

1>、docker 安装
    1)、移除旧版本的 docker
    yum remove docker docker-common docker-selinux docker-engine
    yum remove docker-ce
    rm -rf /var/lib/docker

    2)、查看有没有安装 
    rpm -qa|grep device-mapper-persistent-data
    rpm -qa|grep lvm2

    3)、安装
    yum install -y yum-utils device-mapper-persistent-data lvm2

    4)、配置镜像地址
    yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

    5)、然后修改镜像地址,更改为国内的,这样可以下载快一点
    vim /etc/yum.repos.d/docker-ce.repo
    修改地址为清华的 
    %s@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce

    6)、更新缓存 
    yum makecache fast


2>、docker ce安装
    1)、安装最新版的 docker-ce
    yum install -y docker-ce docker-ce-cli containerd.io
    ##安装指定版本docer-ce 可使用以下命令查看
    yum list docker-ce.x86_64 --showduplicates |sort -r

    ##安装完成之后可以使用命令查看 
    docker version

3>、配置 docker 镜像加速
    vim /etc/docker/daemon.json
    {
        "registry-mirrors" : ["https://v16stybc.mirror.aliyuncs.com"]
    }

    ##通知 systemd 重载此配置文件
    systemctl daemon-reload

    ##设置开机启动
    systemctl enable docker 

    ##启动 docker
    systemctl start docker

2、k8s 准备工作相关(两个节点都要执行)

k8s 相关配置
1)、设置系统主机名以及 Host 文件的相互解析
    hostnamectl  set-hostname  k8s-master01

2)、修改 hosts 文件
    vim /etc/hosts
    192.168.56.2 k8s-master01
    192.168.56.3 node01

3)、验证 uuid 和 mac 地址(enp0s3 根据自己的进入相应的目录,ip addr 看一下网卡的名字即可)
cat /sys/class/net/enp0s3/address
cat /sys/class/dmi/id/product_uuid

4)、安装依赖包
    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git

5)、设置防火墙为 Iptables 并设置空规则
    systemctl  stop firewalld  &&  systemctl  disable firewalld

    yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables&&  iptables -F  &&  service iptables save

6)、关闭 SELINUX(临时禁用&&永久禁用)
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

7)、调整内核参数,对于 K8S
    vim kubernetes.conf
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.swappiness=0 
    # 不检查物理内存是否够用
    vm.overcommit_memory=1 
    # 开启 OOM
    fs.inotify.max_user_instances=8192
    vm.panic_on_oom=0 
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1
    net.netfilter.nf_conntrack_max=2310720

    cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf

    sysctl -p /etc/sysctl.d/kubernetes.conf


8)、 修改Cgroup Driver
    1>、修改daemon.json
    [root@k8s-master01 ~]# vim /etc/docker/daemon.json 
    {
      "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]//新增这行
    }
    2>、 重新加载docker
    [root@k8s-master01 ~]# systemctl daemon-reload && systemctl restart docker
    
    修改cgroupdriver是为了消除告警:
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/


9)、新增 k8s 源
    [root@k8s-master01 ~]#vim /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

    [] 中括号中的是repository id,唯一,用来标识不同仓库
    name 仓库名称,自定义
    baseurl 仓库地址
    enable 是否启用该仓库,默认为1表示启用
    gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
    repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
    gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了

    更新缓存
    [root@k8s-master01 ~]# yum clean all
    [root@k8s-master01 ~]# yum -y makecache


10)、调整系统时区,设置系统时区为中国/上海
    timedatectl set-timezone Asia/Shanghai

    将当前的 UTC 时间写入硬件时钟
    timedatectl set-local-rtc 0

    重启依赖于系统时间的服务
    systemctl restart rsyslog
    systemctl restart crond

11)、关闭系统不需要的服务
    systemctl stop postfix && systemctl disable postfix

12)、设置 rsyslogd 和 systemd journald
    mkdir /var/log/journal 

    持久化保存日志的目录
    mkdir /etc/systemd/journald.conf.d

    vim /etc/systemd/journald.conf.d/99-prophet.conf 
    Journal]
    #持久化保存到磁盘
    Storage=persistent
    # 压缩历史日志
    Compress=yes
    SyncIntervalSec=5
    mRateLimitInterval=30s
    RateLimitBurst=1000
    # 最大占用空间 10G
    SystemMaxUse=10G
    # 单日志文件最大 200M
    SystemMaxFileSize=200M
    # 日志保存时间 2 周
    MaxRetentionSec=2week
    # 不将日志转发到 
    syslogForwardToSyslog=no

    systemctl restart systemd-journald

13)、升级系统内核为 4.44CentOS 7.x 
    系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

    安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
    yum --enablerepo=elrepo-kernel install -y kernel-lt

    设置开机从新内核启动
    grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

 

3、master 节点安装

1. 版本查看
[root@k8s-master01 ~]# yum list kubelet --showduplicates | sort -r 

2. 安装kubelet、kubeadm和kubectl(不指定版本,默认用的就是最新版本)
    yum install -y kubelet kubeadm kubectl

    2.1.安装包说明
    kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
    kubeadm 用于初始化集群,启动集群的命令工具
    kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

    2.2.启动kubelet并设置开机启动
    [root@k8s-master01 ~]# systemctl enable kubelet && systemctl start kubelet

    2.3.kubelet命令补全
    [root@k8s-master01 ~]## echo "source <(kubectl completion bash)" >> ~/.bash_profile
    [root@k8s-master01 ~]# source ~/.bash_profile 


3. 下载镜像
    3.1 Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。

    [root@k8s-master01 ~]## vim image.sh 
    #!/bin/bash
    url=gcr.azk8s.cn/google-containers
    version=v1.17.3
    images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
    for imagename in ${images[@]} ; do
          docker pull $url/$imagename
          docker tag $url/$imagename k8s.gcr.io/$imagename
          docker rmi -f $url/$imagename
    done
    
    url为阿里云镜像仓库地址,version为安装的kubernetes版本。

    3.2 下载镜像
    1)、首先要给 image.sh 赋于执行权限
    chmod u+x ./image.sh

    2)、运行脚本image.sh,下载指定版本的镜像
    ./image.sh

4.初始化 master
    4.1 初始化 
    [root@k8s-master01 ~]# kubeadm init --apiserver-advertise-address 192.168.56.2 --pod-network-cidr=10.244.0.0/16
    apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案

    记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中。输出大概如下的内容:
    To start using your cluster, you need to run the following as a regular user:
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config

    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/

    Then you can join any number of worker nodes by running the following on each as root:

    kubeadm join 192.168.56.2:6443 --token f09fag.fohc5f0v9eb4ail5 \
        --discovery-token-ca-cert-hash sha256:5c08d18980a8e0c251664fda92427814a02c31b152ac553b6539b5123067ce86 

    4.2 加载环境变量
     [root@k8s-master01 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    [root@k8s-master01 ~]# source ~/.bash_profile 
    
    本文所有操作都在root用户下执行,若为非root用户,则执行如下操作:
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config

5. 安装pod网络(如果此命令执行不成功,可能是文件拉取的问题,直接把这个文件下载到本地即可)
[root@k8s-master01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/
kube-flannel.yml

下载本地后执行:(直接打开网址,复制到本地文件中)
[root@k8s-master01 ~]#kubectl apply -f kube-flannel.yml


6. master节点配置
    taint:污点的意思。如果一个节点被打上了污点,那么pod是不允许运行在这个节点上面的

    6.1 删除master节点默认污点
    默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作:

    查看污点:
    [root@k8s-master01 ~]# kubectl describe node master|grep -i taints
    Taints:             node-role.kubernetes.io/master:NoSchedule
    删除默认污点:

    [root@k8s-master01 ~]# kubectl taint nodes master node-role.kubernetes.io/master-
    node/master untainted
    6.2 污点机制
    语法
    kubectl taint node [node] key=value[effect]   
         其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
          NoSchedule: 一定不能被调度
          PreferNoSchedule: 尽量不要调度
          NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
    
    打污点
    [root@k8s-master01 ~]# kubectl taint node master key1=value1:NoSchedule
    node/master tainted
    [root@k8s-master01 ~]# kubectl describe node master|grep -i taints
    Taints:             key1=value1:NoSchedule
    key为key1,value为value1(value可以为空),effect为NoSchedule表示一定不能被调度

    删除污点:
    [root@k8s-master01 ~]# kubectl taint nodes master  key1-     
    node/master untainted
    [root@k8s-master01 ~]# kubectl describe node master|grep -i taints
    Taints:             <none>
    删除指定key所有的effect,‘-’表示移除所有以key1为键的污点

4、Node节点安装

1)、查看令牌
[root@k8s-master01 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
dnpkej.113e5cokaq30qcra   18h         2020-02-25T12:12:21+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

2)、 生成新的令牌(如果过期的话)
[root@k8s-master01 ~]# kubeadm token create
dnpkej.113e5cokaq30qcra 

3)、 生成新的加密串
[root@k8s-master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'
63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3

4)、 node节点加入集群
在node节点上分别执行如下操作:
[root@node01 tmp]# kubeadm join 192.168.56.2:6443 --token dnpkej.113e5cokaq30qcra     --discovery-token-ca-cert-hash sha256:63de5412694706097a440cb9375d5e06207dfdf225579aa04b489b6470ea46c3

5、Dashboard安装

1. 下载yaml
[root@k8s-master01 ~]# wget  https://github.com/yeyinzhu321/Centos7.6-install-k8s-v1.14.2-cluster/blob/master/kubernetes-dashboard.yaml

2. 配置yaml
2.1 修改镜像地址
sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/kuberneters/g' kubernetes-dashboard.yaml
由于默认的镜像仓库网络访问不通,故改成阿里镜像

2.2 外网访问
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml
配置NodePort,外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001

2.3 新增管理员帐号(在文件最后添加如下的配置)
vim kubernetes-dashboard.yaml 
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
创建超级管理员的账号用于登录Dashboard

3. 部署访问
3.1 部署Dashboard
[root@k8s-master01 ~]# kubectl apply -f kubernetes-dashboard.yaml 

3.2 状态查看
[root@k8s-master01 ~]# kubectl get deployment kubernetes-dashboard -n kube-system
[root@k8s-master01 ~]# kubectl get pods -n kube-system -o wide
[root@k8s-master01 ~]# kubectl get services -n kube-system

3.3 令牌查看
kubectl describe secrets -n kube-system dashboard-admin
令牌为:
eyJhbGciOiJSUzI1NiIsImtpZCI6InZDSWF3X1JBcjB6ZGFzbF9pZ0N4a0FKTEREMTFtZUJGVzlFVUJOdUNMMkEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tc21tdzkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYmE5MzExYzMtMDMyOC00ZTUzLTg0M2MtNjZhN2I4YzA4Njc3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.xi7exXIYJYr1r8epqdDqajmWK_5vIqcqvNhjEkmkkOstsH5eiFdlKvyIYNm416-98mD5CPYRWq4aSl1DmXYa1un6a37X0WV0bKaDDEj-oCCnFs5Sucol7sCs5IGMZ8xVRwQCYseLlPGJCuY0u3d-Fx3BtuiHlvuHKLIMEgNWHOIgcCX1bzArK7tBBQkzT6XJrwoij6NuV4cxbegTQ6WNbAAlx-m862lfzP9mcK_fM5fOvAaxePEnMMvqb8kQ4bgTmMKr2DqlS-2F4t6eiOPQx8vFZ-LURopOgAIC8akbbsfdnB1TJ9aaYdxqwG3BggR2mv1qEcp4dmdXKkn4tBeHnw


3.4 访问 https://NodeIp:30001
Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。

 

6、集群测试

1. 部署应用
1.1 命令方式
[root@k8s-master01 ~]# kubectl run httpd-app --image=httpd --replicas=2

通过命令行方式部署apache服务

1.2 配置文件方式
vim nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
spec:
  type: NodePort
  ports:
  - name: nginx
    nodePort: 30000
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

[root@k8s-master01 ~]# kubectl apply -f nginx.yml 
deployment.extensions/nginx created
通过配置文件方式部署nginx服务

2. 状态查看
2.1 查看节点状态
[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    master   5h33m   v1.17.3
node01         Ready    <none>   5h32m   v1.17.3

2.2 查看pod状态
[root@k8s-master01 ~]# kubectl get pod --all-namespaces
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE
default       nginx-demo-85ff79dd56-svdbl             1/1     Running   0          4h12m
kube-system   coredns-6955765f44-498gl                1/1     Running   2          5h33m
kube-system   coredns-6955765f44-5895j                1/1     Running   2          5h33m
kube-system   etcd-k8s-master01                       1/1     Running   1          5h34m
kube-system   kube-apiserver-k8s-master01             1/1     Running   1          5h34m
kube-system   kube-controller-manager-k8s-master01    1/1     Running   1          5h34m
kube-system   kube-flannel-ds-amd64-f8f44             1/1     Running   0          4h55m
kube-system   kube-flannel-ds-amd64-krhxq             1/1     Running   0          4h55m
kube-system   kube-proxy-9gfqq                        1/1     Running   1          5h33m
kube-system   kube-proxy-kzlpw                        1/1     Running   0          5h33m
kube-system   kube-scheduler-k8s-master01             1/1     Running   1          5h34m
kube-system   kubernetes-dashboard-778ff9499c-ph44s   1/1     Running   0          5h21m

2.3 查看副本数
[root@k8s-master01 ~]# kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-demo   1/1     1            1           4h12m

[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-demo-85ff79dd56-svdbl   1/1     Running   0          4h13m   10.244.1.8   node01   <none>           <none>
可以看到nginx和httpd的3个副本pod均匀分布在3个节点上

2.4 查看deployment详细信息
[root@k8s-master01 ~]# kubectl describe deployments


2.5 查看集群基本组件状态
[root@k8s-master01 ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

2.6 测试
[root@k8s-master01 ~]# curl 192.168.56.3:30000       
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 浏览器访问如下:

 

7、 报错总结

1)、image.sh 脚本做一下补充

  1>、url 已经做了修改,按照文中的 url 我下载的时候下载不了,超时,所以我已经改为可以下载的 url 了

  2>、version 一定要改为自己的版本

2)、安装pod网络时 apply 的时候,那个文件一直超时,如果这样可以直接下载此文件即可

 

3)、如果 kubeadm init apply 的时候提示 xxx folder exist,执行如下的语句

  kubeadm reset 

4)、集群测试的时候 nginx.yaml 中如果apiVersion 写的是 extension/v1beta1 的话,会报错.改为如下的即可

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
spec:
  type: NodePort
  ports:
  - name: nginx
    nodePort: 30000
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
posted @ 2020-02-24 17:58  竹子91  阅读(2551)  评论(0编辑  收藏  举报