1.简介

1.1pod网络

总述:Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中

  1. Flannel:基于L2,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。
  2. Calico:纯L3,构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。

1.2组件简介

  1. Master节点:
    • API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作的唯一入口,也是集群中的入口进程
    • Controller Manager(kube-controller-manager):kubernetes里所有资源对象的自动化控制中心,可以理解成为资源对象的“大总管”
    • Scheduler:(kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
    • Etcd:所有资源对象的数据被会被保存到etcd中,持久化
  2. Node节点:
    • docker engine:docker引擎,负责本主机的容器创建 和管理工作
    • kubelet:负责pod对应容器的创建,启停等任务,另外kubelet与master紧密协作,随时报告给master自身的情况,如CPU,内存,操作系统,docker版本等
    • kube-proxy:实现kubernetes server的通信与负载均衡机制的重要组件;提供svc服务(服务发现);负责写入规则至 IPTABLES(ip数据包过滤)、IPVS(负载均衡) 实现服务映射访问的;
  3. k8s其它组件:
    • kubectl:命令行工具
    • DASHBOARD:网页面板;给 K8S 集群提供一个 B/S 结构访问体系

1.3k8s

  1. pod控制器:Deployment 》ReplicaSet 》pod
    • kubectl run 并不是直接创建一个 Pod,而是先创建一个 Deployment 资源(replicas=1),再由与 Deployment 关联的 ReplicaSet 来自动创建 Pod
  2. CNI(flannel或Calico)将为pod构建网络。
  3. 为pod创建svc 可以获取cluster_ip

2.环境

在这里插入图片描述
在这里插入图片描述

  1. linux
    • 5.6.5-1.el7.elrepo.x86_64
    • CentOS Linux release 7.7.1908 (Core)
  2. docker
    • Docker version :docker-ce-18.06.0.ce-3.el7
  3. docker-compose
    • docker-compose version 1.25.4
  4. k8s:版本 1.17.2
    • kube-controller-manager:1.17.2
    • kube-scheduler:1.17.2
    • kube-apiserver:1.17.2
    • kubectl:1.17.2
    • kube-proxy:1.17.2
    • etcd:3.4.3-0
    • pause:3.1
    • coredns:1.6.5

3.安装k8s1.17.2

3.1系统准备

主要配置:

  1. 设置主机名:

    #master01
    hostnamectl set-hostname k8s-master01
    #node01
    hostnamectl set-hostname k8s-node01
    #node02
    hostnamectl set-hostname k8s-node02
    
  2. host文件 ip解析

    master01 hosts文件需要写入node节点;node节点只需要写入自己和master01节点

    #master01
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.93 k8s-node01
    192.168.2.92 k8s-node02
    #node01
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.93 k8s-node01
    #node02
    vi /etc/hosts
    192.168.2.94 k8s-master01
    192.168.2.92 k8s-node02
    
  3. master01节点上配置免密登录node节点

    #生成ssh
    ssh-keygen
    #拷贝生成的公钥到其它节点
    ssh-copy-id -i root@k8s-node01
    ssh-copy-id -i root@k8s-node02
    
  4. yum安装依赖包:

    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
    
  5. 设置防火墙为 Iptables 并设置空规则:kubeproxy操作iptables

    #停止、禁用默认防火墙firewalld
    systemctl stop firewalld && systemctl disable firewalld
    #安装设置iptables防火墙
    yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
    
  6. 关闭swap分区:pod运行在swap分区中会大大影响效率

    • 临时关闭:
    
    
    • 永久关闭:
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    
  7. 禁用SELINUX:开启会限制服务进程访问资源

    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
  8. 配置内核参数:将桥接的IPv4流量传递到iptables过滤链

    cat > kubernetes.conf <<EOF
    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
    vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.overcommit_memory=1 # 不检查物理内存是否够用
    vm.panic_on_oom=0 # 关闭 OOM
    fs.inotify.max_user_instances=8192
    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
    EOF
    cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
    sysctl -p /etc/sysctl.d/kubernetes.conf
    
  9. 日志处理:采用 systemd journald日志记录方式而不是rsyslogd方式

    mkdir /var/log/journal # 持久化保存日志的目录
    mkdir /etc/systemd/journald.conf.d
    cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
    [Journal]
    # 持久化保存到磁盘
    Storage=persistent
    # 压缩历史日志
    Compress=yes
    SyncIntervalSec=5m
    RateLimitInterval=30s
    RateLimitBurst=1000
    # 最大占用空间 10G
    SystemMaxUse=10G
    # 单日志文件最大 200M
    SystemMaxFileSize=200M
    # 日志保存时间 2 周
    MaxRetentionSec=2week
    # 不将日志转发到 syslog
    ForwardToSyslog=no
    EOF
    systemctl restart systemd-journald
    
  10. 开启IPVS(负载均衡):

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe br_netfilter
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack
    EOF
    
    #操作上面创建的文件
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    

其它配置:可配置可不配置

  1. 关闭系统不需要的服务:

    #postfix邮件服务
    systemctl stop postfix && systemctl disable postfix
    
  2. 调整系统时区

    # 设置系统时区为 中国/上海
    timedatectl set-timezone Asia/Shanghai
    # 将当前的 UTC 时间写入硬件时钟
    timedatectl set-local-rtc 0
    # 重启依赖于系统时间的服务
    systemctl restart rsyslog
    systemctl restart crond
    

3.2安装配置docker

  1. 删除旧版本

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine
    
  2. 安装工具

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  3. 设置python版本

    建议升级py2到py3

    #将第一行python换为python2.7
    vi /usr/bin/yum-config-manager
    
  4. 添加yum信息

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  5. 更新yum缓存

    yum makecache fast
    
  6. 查看可用的docker版本

    yum list docker-ce --showduplicates | sort -r
    
  7. 安装docker-ce

    yum -y install docker-ce-18.06.0.ce-3.el7
    
  8. 启动设置开启自启

    systemctl start docker && systemctl enable docker
    
  9. 设置阿里镜像源

    #注意,先运行一次docker 才会有这个文件夹
    vi /etc/docker/daemon.json
    #加入以下内容;insecure-registries 设置不安全的镜像仓库,自己的harbor仓库;exec-opts k8s需要docker以systemd的模式运行
    {
    	"registry-mirrors": [
    		"http://docker.mirrors.ustc.edu.cn",
    		"https://自己在阿里云去配置.com",
    		"http://hub-mirror.c.163.com",
    		"http://registry.docker-cn.com"
    	],
    	"insecure-registries": [
    		"192.168.2.60:9999"
    	],
    	"exec-opts": ["native.cgroupdriver=systemd"],
    	"log-driver": "json-file",
    	"log-opts": {"max-size": "100m"}
    }
    
  10. 创建systemd所需目录

    mkdir -p /etc/systemd/system/docker.service.d
    
  11. 重启docker并设置开机自启

    systemctl daemon-reload && systemctl restart docker && systemctl enable docker
    

3.3安装docker-compose

  1. 从github上下载docker-compose二进制文件

    curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
  2. 将下载的文件放置在/usr/local/bin/

  3. 将下载文件赋予可执行权限

    chmod +x /usr/local/bin/docker-compose
    
  4. 测试

    docker-compose --version
    

3.4安装k8s kubectl、kubelet、kubeadm

  1. 配置kubernetes的阿里云yun源

    cat > /etc/yum.repos.d/kubernetes.repo  <<EOF
    [kubernetes]
    name=Kubernetes repo
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    enabled=1
    EOF
    
  2. 安装

    yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
    
  3. 启动kubelet服务

    systemctl enable kubelet && systemctl start kubelet
    

3.5初始化k8s集群

在master01节点执行初始化

  1. 输出初始化默认配置到文件kubeadm-config.yaml

    kubeadm config print init-defaults > kubeadm-config.yaml
    

    增加:podSubnet;修改kubernetesVersion;修改advertiseAddress(masterIP);修改imageRepository为阿里云

    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.2.94
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: k8s-master01
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.17.2
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    
    scheduler: {}
    
  2. 执行初始化命令将命令结果记录到kubeadm-init.log中

    kubeadm init --config=kubeadm-config.yaml --v=6 --upload-certs | tee kubeadm-init.log
    

    如果报错,有镜像未被拉取下来,重新执行一次;或者直接从阿里云拉取镜像

    示例:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.2.24
    
  3. 讲解kubeadm-init.log

    kubelet环境变量:/var/lib/kubelet/kubeadm-flags.env
    kubelet配置信息:/var/lib/kubelet/config.yaml
    k8s所有的证书:/etc/kubernates/pki ;采用https的证书安全策略;ca厂商;私钥;crt证书
    k8s所有的配置文件:/etc/kubernates ;controller-manager.conf;scheduler.conf等配置文件都在这个目录下
    $HOME/.kube作用:kubectl与apiserver以http协议进行交互,产生的缓存存储在这里;config认证文件也会保存在这个目录下。

  4. 根据kubeadm-init.log 提示操作:查看自己的kubeadm-init.log操作

    在master节点执行

    #创建交互缓存目录 .kube 
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    

sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config


在node节点执行:将当前节点加入k8s

```shell
kubeadm join 192.168.2.94:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:64a70d3945cf0ef0ace4f9e793d494de274f5a43c05020a80b5c1c915974e22a 

3.7配置CNI网络

暂时使用Flannel(基于L2)构建扁平化的网络;以后升级到Calico(完全基于L3)

在master01节点执行操作

  1. 创建flannel目录

    mkdir install-k8s/plugin/flannel
    cd install-k8s/plugin/flannel
    
  2. 创建yaml文件

    #访问 https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 复制其中的内容到kube-flannel.yml文件中
    vi kube-flannel.yml
    
  3. 执行yaml文件创建扁平化网络

    kubectl apply -f kube-flannel.yml
    
  4. 测试

    #所有节点STATUS 为Ready 构建成功
    kubectl get node
    #查看网络,多了一个flannel.1的网络
    ifconfig
    

3.8保存重要文件

mkdir install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core
mv install-k8s/ /usr/local

3.9安装配置harbor

。。。最好配置域名;配置假的CA证书,否则kubectl run nginx-deployment --image=192.168.2.60:9999/k8s/myapp:v1 --port=80 --replicas=1 命令无法成功执行;因为无法区分:9999 和 myapp:v1

详细见 Harbor - 企业级 Docker 私有仓库.pdf

一些命令:

#打标签 原来的标签为 repository:tag
docker tag wangyanglinux/myapp:v1 192.168.2.60:9999/k8s/myapp:v1
#登录
docker login 192.168.2.60:9999
#上传 harbor地址/项目/仓库/镜像
docker push 192.168.2.60:9999/k8s/myapp:v1

3.10pod测试

  1. 拉取镜像

    docker pull wangyanglinux/myapp:v1
    
  2. 生成deployment

    –image=指定的镜像是本地镜像名称:tag

    kubectl run nginx2-deployment --image=wangyanglinux/myapp:v1 --port=80 --replicas=1
    
  3. 查看发布,REDY 1/1才表示成功

    kubectl get deployment
    
  4. 测试根据套接字访问某个pod

    #获取pod详细信息;里面有构成的pod的网络ip
    kubectl get pod -o wide
    #已经构成了扁平化的网络,直接通过私有ip是可以访问的pod的;根据上面的kubectl run port=80
    curl ip:port
    #获取某个pod的hostname
    curl ip:port/hostname.html
    
  5. pod控制器控制副本数目

    删除pod,查看pod仍然存在

    #删除pod
    kubectl delete pod NAME
    #查看pod信息,发现还是有这个pod,NAME有所不同;因为,kubectl run --replicas=1 指定了需要维持的副本数目
    kubectl get pod
    
  6. 水平扩展

    #水平扩展 deployment/名字  在kubectl run 指定的名字
    kubectl scale --replicas=3 deployment/nginx-deployment
    #查看pod
    kubectl get pod -o wide
    

3.11开启kubeproxy负载均衡

注意,需要首先在虚拟机上开启ipvs,kubeproxy的负载均衡是基于ipvs的

  1. 修改ConfigMap的kube-system/kube-proxy中的config.conf,把 mode: “” 改为mode: “ipvs" 保存退出即可

    kubectl edit cm kube-proxy -n kube-system
    
  2. 删除之前的kube-proxy pod

    kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
    
  3. 查看proxy运行状态

    kubectl get pod -n kube-system | grep kube-proxy
    
  4. 查看日志,如果有Using ipvs Proxier 说明kube-proxy的ipvs 开启成功

    #kube-proxy-54qnw为上面一条命令执行结果podName
    kubectl logs kube-proxy-54qnw -n kube-system
    
  5. 测试负载均衡

    #负载多个pod,一般方案通过nginx去负载;现在使用svc
    #target-port是内部端口,deployment_NAME就是run pod时使用到的deploymentname
    kubectl expose deployment deployment_NAME --port=30000 --target-port=80
    #查看svc,获取cluster_ip
    kubectl get svc
    #根据 Cluster-ip访问
    curl cluster-ip:port
    #测试,发现发现pod_name在变化 因为是轮询的机制(ipvs提供的负载均衡轮询机制)
    curl cluster-ip/hostname.html
    
  6. ipvsadm管理ipvs

    #使用ipvs管理工具 ipvsadm 查看某个ip负载机制
    ipvsadm -Ln | grep clusterIP
    #看完全
    ipvsadm -Ln
    

3.12外网访问

#编辑svc;将type: ClusterIP改为type: NodePort
kubectl edit svc svcName
#再次查看svc,发现给了一个端口 例如,30000:31859 (由内而外);作用,所有的节点都暴露这个可以访问的端口;查看type是否为NodePort
kubectl get svc
#浏览器访问这个端口;使用 主节点ip:31859 可以访问;使用 起他节点ip:31859 也可以访问

4.kubectl命令

#获取所有节点
kube get node
#检查组件的健康状态;componentstatus可简写为cs
kubectl get componentstatus 
#查看deployment;控制器deployment会使用RS创建pod
kubectl get deployment
#查看ReplicaSet
kubectl get rs
#获取pod状态 -n --name 名空间
kubectl get pod -n kube-system
#查看pod更详细的信息,node节点在init过程中;-o option
kubectl get pod -n kube-system -o wide
#替代命令,持续监视 -w watch
kubectl get pod -n kube-system -w
#删除pod
kubectl delete pod podName
#删除RS
kubectl delete rs rsName
#删除deployment
kubectl delete deployment deploymentName
#删除svc
kubectl delete svc svcname
#查看pod日志
kubectl -n kube-system logs -f <pod name>
#应用资源清单
kubectl apply -f pod.yml

5.安装Dashboard

5.1默认用户和管理员登录

dashboard官网

在master01节点下执行:

  1. /usr/local/install-k8s/plugin/dashboard/目录下创建recommend.yaml ;访问官网将内容拷贝

    Dashboard-github

    vi recommend.yaml
    
  2. 修改recommend.yaml

    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      ports:
        - port: 443
          targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
    

    修改为

    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort #新增
      ports:
        - port: 443
          nodePort: 30001 #新增
          targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
    
    spec:
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.0-beta8
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
    

    修改为

    spec:
      # nodeName: master.node 指定到master节点,指不指定根据需要
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.0.0-beta8
          # imagePullPolicy: Always
          imagePullPolicy: IfNotPresent #镜像下载策略 不存在再下载
          ports:
            - containerPort: 8443
              protocol: TCP
    
  3. 下载Dashboard镜像

    docker pull kubernetesui/dashboard:v2.0.0-beta8
    
  4. 应用recommend.yaml

    kubectl apply -f recommended.yaml
    
  5. 查看svc状态,与dashboard有关的pod都必须Ready 1/1

    kubectl get pods,svc -n kubernetes-dashboard -o wide
    
  6. 浏览器访问:注意使用https

    https://192.168.2.94:30443/

  7. 默认用户:点击token,使用token方式登录

    默认用户kubernetes-dashboard 登录;很多数据访问不了。

    #获取用户名密码
    kubectl  get sa,secrets -n kubernetes-dashboard
    #获取token,kubernetes-dashboard-token-ls8l4 后面几位有所不同
    kubectl describe secrets kubernetes-dashboard-token-ls8l4 -n kubernetes-dashboard
    

    复制token 填写到浏览器上。

  8. 新增管理员用户:点击token,使用token方式登录

    /usr/local/install-k8s/plugin/dashboard/目录下创建create-admin.yaml

    填入一下内容:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kubernetes-dashboard
    

    应用:

    kubectl apply -f create-admin.yaml
    

    查看与dashboard有关pod是否ready 1/1

    kubectl get sa,secrets -n kubernetes-dashboard
    

    管理员账户登录能访问所有数据:

    #获取用户名密码
    kubectl  get sa,secrets -n kubernetes-dashboard
    #获取token,admin-user-token-ls8l4 后面几位有所不同
    kubectl describe secrets admin-user-token-ls8l4 -n kubernetes-dashboard
    

    将token复制到浏览器,发现可以访问所有数据

5.2问题解决

  1. 如果发现创建的dashboard有错,需要先删除错误的。

    kubectl delete  -f recommended.yaml
    

6.Ingress安装

6.1简介

ingress可以实现7层网络协议即应用层https层;内部原理可以理解为使用nginx进行反向代理

6.2安装

  1. 选择模式:Bare-metal

    获取官网yaml文件

    ​ Bare-metal deploy.yaml

    提前pull mandatory.yaml文件中所需镜像

    #获取yaml文件中所需镜像名
    cat mandatory.yaml | grep image
    #在master和node节点中pull镜像
    docker pull 镜像
    

    应用deploy.yaml文件

    kubectl apply -f deploy.yaml
    
  2. 测试

    #查看名称空间ingress-nginx,有没有叫ingress-controller***的svc
    kubectl get svc -n ingress-nginx
    #查看名称空间ingress-nginx,有没有叫ingress-controller***的pod
    kubectl get pod -n ingress-nginx
    

10.问题解决

  1. No more mirrors to try:

    yum makecache
    

11.参考网址

参考网址-安装

参考网址-安装

参考网址->kernel 4.19 开启ipvs

参考网址-开启ipvs

参考网址-安装Dashboard

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐