• kubeadm介绍
    • kubeadm是一个工具,提供了kubeadm init以及kubeadn join这两个命令来快速创建kubernetes集群
    • kubeadm会将k8s的核心组件部署为Pod。kubelet和docker为系统守护进程模式,且运行为静态static Pod。
    • 守护进程模式组件
      • kubelet
      • kubeadm
      • kubectl
      • docker-ce
      • 容器启动模式组件
        • kube-apiserver
        • kube-proxy
        • kube-controller-manager
        • kube-scheduler
        • etcd
        • coredns
        • kube-flannel
  • 安装环境
    • 10.0.31.181 master.larryyu.com
    • 10.0.31.182 node1.larryyu.com
    • 10.0.31.183 node2.larryyu.com
  • 前提
    • 基于主机名通信
    • 时间同步
    • 关闭firewalld和iptables.service
  • 安装配置步骤

    • yum环境配置(所有节点)

      • 增加docker-ce repo配置

        1. $ wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
      • 增加kubernetes repo配置

        1. $ vim kubernetes.repo
        2. [kubernetes]
        3. name=Kubernetes Repo
        4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
        5. gpgcheck=1
        6. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
        7. # 注,阿里云的kubenetes yum源如果开启pgpcheck需要导入pgpkey
        8. $ wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
        9. $ wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        10. $ rpm --import yum-key.gpg
        11. $ rpm --import rpm-package-key.gpg
    • 安装守护进程组件

      $ yum -y install kubelet kubeadm kubectl docker-ce
      
    • 修改仓库代理

      • Kubeadm在安装时会从docker仓库下载镜像,但在国内可能无法下载,可修改docker启动配置文件增加代理
        $ vim /usr/lib/systemd/system/docker.service
        Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
        
    • 启动docker服务

      $ systemctl daemon-reload
      $ systemctl restart docker
      $ docker info
      ...
      HTTPS Proxy: http://www.ik8s.io:10080 # 代理地址
      Registry: https://index.docker.io/v1/
      ...
      
    • 设置开机启动

      $ systemctl enable kubelet
      $ systemctl enable docker
      
    • 打开内置桥接功能

      • k8s在运行中会生成很多iptables或者ipvs规则,建议打开系统内置的桥接功能,否者会在kubeadm init时报错。
        $ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
        $ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
        
  • master节点安装

    • 初始化kubernetes命令介绍
      $ kubeadm init --help
      --apiserver-advertise-address string      # apiserver监听地址
      --apiserver-bind-port int32               # 要绑定到的API服务器的端口。(默认值6443)
      --cert-dir string                         # 保存和存储证书的路径
      --certificate-key string                  # 用于加密证书的密钥           
      --config string                           # kubeadm配置文件的路径               
      --dry-run                              
      --ignore-preflight-errors strings         # 忽略错误检查,例如:“IsPrivilegedUser,Swap” 
      --kubernetes-version string               # 指定Kubernetes版本   
      --node-name string                        # 指定node节点名称
      --pod-network-cidr string                 # 指定pod网络的IP地址范围。
      --service-cidr string                     # 为service设置IP地址范围。(默认为“10.96.0.0/12”)
      
  • 初始化工作流程

    • 在初始化之前,进行系统状态检查,如果遇到错误,会直接退出初始化,知道问题解决或者用户使用—ignore-preflight-errors=
    • 生成自签名证书,为集群中每个组件配置CA证书或者秘钥
    • 写入kubeconfig文件/etc/kubernetes/以供kubelet控制器管理器和调度程序用于连接到API服务器,以及一个名为的用于管理的附加kubeconfig文件admin.conf。
    • 为API服务器,控制器管理器和调度程序生成静态Pod清单。如果未提供外部etcd,则会为etcd生成一个附加的静态Pod清单。
  • 初始化Kubernetes主节点 ```bash

    初始化节点

    $ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12

    ERROR—-k8s默认不允许开启swap,否者在初始化时会报错退出

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

    解决—-忽略swap错误

    $ vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=”—fail-swap-on=false”

再次初始化

$ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12 —ignore-preflight-errors=Swap

ERROR—-最近代理www.ik8s.io:10080也无法使用了,只能先下载了

… [ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.6.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: proxyconnect tcp: dial tcp 172.96.236.117:10080: connect: connection refused …

解决—-指定使用阿里云仓库下载

1、删除前面添加的代理配置Environment=”HTTPS_PROXY=http://www.ik8s.io:10080“ 2、在init命令中添加—image-repository registry.aliyuncs.com/google_containers参数 $ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12 —image-repository registry.aliyuncs.com/google_containers —ignore-preflight-errors=Swap …

安装成功会有如下提示

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 10.0.31.181:6443 —token 4r3cpc.j1llf4lpsen8s1xb \ —discovery-token-ca-cert-hash sha256:819a5e9c2a567f50d80e6dfb5c8978a24323a150397ccffae3a4884b204e0b89 …

根据提示执行命令

$ mkdir -p $HOME/.kube $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

下载完成后可以查看下载的image

$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-proxy v1.16.2 8454cbe08dc9 3 weeks ago 86.1MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.16.2 6e4bffa46d70 3 weeks ago 163MB registry.aliyuncs.com/google_containers/kube-scheduler v1.16.2 ebac1ae204a2 3 weeks ago 87.3MB registry.aliyuncs.com/google_containers/kube-apiserver v1.16.2 c2c9a0406787 3 weeks ago 217MB registry.aliyuncs.com/google_containers/etcd 3.3.15-0 b2756210eeab 2 months ago 247MB registry.aliyuncs.com/google_containers/coredns 1.6.2 bf261d157914 3 months ago 44.1MB registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 23 months ago 742kB


- 初始化完成后可使用kubectl命令查看集群状态
```bash
# kubectl常用的get命令
kubectl cluster-info                    # 查看集群状态信息
kubectl get cs -o yaml                  # 查看集群状态
kubectl get nodes                       # 查看集群节点信息
kubectl get ns                          # 查看集群命名空间
kubectl get svc -n kube-system          # 查看指定命名空间的服务
kubectl get pod <pod-name> -o wide      # 查看Pod详细信息
kubectl get pod <pod-name> -o yaml      # 以yaml格式查看Pod详细信息
kubectl get pods -n kube-system          # 查看资源对象,查看所有Pod列表
kubectl get rc,service                  # 查看资源对象,查看rc和service列表
kubectl get pod,svc,ep --show-labels    # 查看pod,svc,ep能及标签信息
kubectl get all --all-namespaces        # 查看所有的命名空间
kubectl describe nodes <node-name>  # 显示Node的详细信息
kubectl describe pods/<pod-name>    # 显示Pod的详细信息
  • 在初始化完成后使用kubectl get nodes查看节点信息
    可以看到master的STATUS为NotReady状态,这是因为集群没有网络组件,需单独下载安装网络组件

    $ kubectl get nodes
    NAME                 STATUS     ROLES    AGE   VERSION
    master.larryyu.com   NotReady   master   23m   v1.16.2
    # 此处使用flannel来作为网络组件
    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    # 查看pod创建情况,需要使用-n指定名称空间
    $ kubectl get pods -n kube-system
    NAME                                         READY   STATUS    RESTARTS   AGE
    coredns-58cc8c89f4-5zp4b                     1/1     Running   0          29m
    coredns-58cc8c89f4-lmzmz                     1/1     Running   0          29m
    etcd-master.larryyu.com                      1/1     Running   0          28m
    kube-apiserver-master.larryyu.com            1/1     Running   0          28m
    kube-controller-manager-master.larryyu.com   1/1     Running   0          29m
    kube-flannel-ds-amd64-dt768                  1/1     Running   0          2m41s
    kube-proxy-77vcj                             1/1     Running   0          29m
    kube-scheduler-master.larryyu.com            1/1     Running   0          28m
    # 再次查看节点状态
    $ kubectl get nodes
    NAME                 STATUS   ROLES    AGE   VERSION
    master.larryyu.com   Ready    master   30m   v1.16.2
    
  • 将node节点加入到集群中
    将之前初始化master时保存的命令在node节点上执行

    $ kubeadm join 10.0.31.181:6443 --token 4r3cpc.j1llf4lpsen8s1xb --discovery-token-ca-cert-hash sha256:819a5e9c2a567f50d80e6dfb5c8978a24323a150397ccffae3a4884b204e0b89  --ignore-preflight-errors=Swap
    # 完成后可以查看节点状态
    $ kubectl get nodes
    NAME                 STATUS     ROLES    AGE    VERSION
    master.larryyu.com   Ready      master   42m    v1.16.2
    node1.larryyu.com    Ready      <none>   108s   v1.16.2
    node2.larryyu.com    NotReady   <none>   64s    v1.16.2
    # 在刚刚加入节点时,node的状态为NotReady,这是因为加入集群后,k8s会为node节点安装flannel组件,在flannel组件安装完成后,集群创建完成
    # 查看kube-system名称空间pod信息
    kubectl get pods -n kube-system -o wide
    NAME                                         READY   STATUS    RESTARTS   AGE     IP         
    coredns-58cc8c89f4-5zp4b                     1/1     Running   0          47m     10.244.0.3 
    coredns-58cc8c89f4-lmzmz                     1/1     Running   0          47m     10.244.0.2 
    etcd-master.larryyu.com                      1/1     Running   0          46m     10.0.31.181
    kube-apiserver-master.larryyu.com            1/1     Running   0          46m     10.0.31.181
    kube-controller-manager-master.larryyu.com   1/1     Running   0          46m     10.0.31.181
    kube-flannel-ds-amd64-47drt                  1/1     Running   0          6m22s   10.0.31.183
    kube-flannel-ds-amd64-dt768                  1/1     Running   0          19m     10.0.31.181
    kube-flannel-ds-amd64-hs498                  1/1     Running   0          7m6s    10.0.31.182
    kube-proxy-2zjvg                             1/1     Running   0          7m6s    10.0.31.182
    kube-proxy-77vcj                             1/1     Running   0          47m     10.0.31.181
    kube-proxy-qqb2l                             1/1     Running   0          6m22s   10.0.31.183
    kube-scheduler-master.larryyu.com            1/1     Running   0          45m     10.0.31.181
    # 可以看到在node1和node2上也启动了flannel和kube-proxy组件