Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。其架构如下图所示:

    本文基于CentOS7.6,部署k8s v1.16.7,详细过程如下:

一、准备工作

1、k8s要求

CentOS:7.4+

Docker:19.03.4推荐,1.13.1, 17.03, 17.06, 17.09, 18.06 ,18.09也可以

硬件需求:CPU>=2c ,内存>=2G

准备2台机器,安装CentOS7.6。ip及主机名计划如下:

192.168.2.9  k8s-master 

192.168.2.10 k8s-node1

2、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

3、禁用SELINUX

vim /etc/selinux/config

将SELINUX设置为disabled:

SELINUX=disabled

4、修改主机名

#设置主机名,主机名不能带下划线

hostnamectl set-hostname k8s-master

通过hostname命令查看主机名。

5、关闭swap

修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载(永久关闭swap)

vim /etc/fstab

# 注释掉以下行,

/dev/mapper/centos-swap     swap                    swap    defaults        0 0

#验证(重启后生效,Swap行均为0)

[root@k8s-master /]# free -m
              total        used        free      shared  buff/cache   available
Mem:           7812         766        5376          58        1669        6670
Swap:             0           0           0

6、配置IP映射

vim /etc/hosts

最后增加以下内容:

192.168.2.9     k8s-master

192.168.2.10   k8s-node1

7、SSH免密码登录

在k8s-master上生成密钥,复制到其他节点上:

cd /root
ssh-keygen -t rsa
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

在/root目录下生成.ssh隐藏文件夹,将.ssh文件夹拷贝到其他机器,完成局域网多机器互信访问。

scp -r .ssh/ k8s-node1:/root/

8、修改内核参数

#命令行执行

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

#手动加载所有的配置文件

sysctl --system

二、安装Docker

在k8s-master和k8s-node1上安装docker,此处安装docker-ce-18.06.3.ce,具体过程如下:

1、 安装必要的一些系统工具

#添加阿里云CentOS yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#命令行执行
yum install yum-utils device-mapper-persistent-data lvm2

2、添加docker源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、安装docker

# 查看Docker-CE版本

yum list docker-ce --showduplicates | sort -r

#安装Docker-CE

yum install docker-ce-18.06.3.ce

4、配置docker

创建/etc/docker/daemon.json,配置国内阿里云镜像加速,配置k8s官方推荐native.cgroupdriver=systemd,将docker默认目录改为大容量磁盘/data目录,最终配置如下:

{
        "registry-mirrors":["https://6r8ktgi2.mirror.aliyuncs.com"],
        "data-root":"/data/docker",
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "10m",
                "max-file": "3"
        }
}

5、启动docker

#启动docker
systemctl start docker
#配置开机启动
systemctl enable docker

三、安装k8s

1、配置k8s阿里云源

由于官方k8s源在google,国内无法访问,这里使用阿里云源,在k8s-master和k8s-node1上命令行执行:

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

ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装

2、k8s-master节点安装

2.1、安装kubeadm、kubelet、kubectl

本处选用k8s 1.16系列最新版本1.16.7。

#如查看kubectl版本
yum list kubectl --showduplicates --nogpgcheck | sort -r
#安装k8s v1.16.7
yum install -y kubelet-1.16.7 kubeadm-1.16.7 kubectl-1.16.7
#启动kubelet服务
systemctl start kubelet
#配置开机启动kubelet服务
systemctl enable kubelet

kubeadm:用来初始化集群(Cluster),启动集群的命令工具

kubelet:运行在集群中的所有节点上,用于启动Pod和容器等对象的工具

kubectl:这个是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

2.2、初始化k8s

#执行kubeadm config images list查看所需镜像

[root@k8s-master ~]# kubeadm config images list
I0311 14:43:40.178181   15003 version.go:251] remote version is much newer: v1.17.3; falling back to: stable-1.16
k8s.gcr.io/kube-apiserver:v1.16.7
k8s.gcr.io/kube-controller-manager:v1.16.7
k8s.gcr.io/kube-scheduler:v1.16.7
k8s.gcr.io/kube-proxy:v1.16.7
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2

#初始化k8s

kubeadm init  --kubernetes-version=v1.16.7 --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.2.9 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

参数解释:

--kubernetes-version: 用于指定k8s版本

--apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 k8s-masterIP地址

--pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16

--service-cidr:用于指定SVC的网络范围;默认10.96.0.0/12

--image-repository: 指定阿里云镜像仓库地址

k8s初始化执行过程较长,可能需要2分钟左右,最后返回如下信息:

Your Kubernetes control-plane has initialized successfully!
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.2.9:6443 --token dli7gh.dclgtwobuj6udsfq \
    --discovery-token-ca-cert-hash sha256:04cb3862ef9f49d891b0d0555e19d01ad67eac2467980d34f7726956705b25ad

最后的kubeadm join命令是在从节点上执行,先记下,稍后从节点配置好再执行,如果忘记,使用kubeadm token create --print-join-command命令获取。输入一下命令完成k8s-master节点配置:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

查看节点状态,主节点为NotReady,继续进行后续配置:

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   NotReady master   19h   v1.16.7

2.3、安装flannel

下载官网fannel配置文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

这个yml配置文件中配置了一个国内无法访问的地址(quay.io),将其替换为国内可以访问的地址(quay-mirror.qiniu.com)。

安装flannel

kubectl apply -f kube-flannel.yml

查看节点信息:

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   19h   v1.16.7

3、k8s-node1节点安装

3.1、安装kubeadm、kubelet、kubectl

#安装k8s v1.16.7
yum install -y kubelet-1.16.7 kubeadm-1.16.7 kubectl-1.16.7
#启动kubelet服务
systemctl start kubelet
#配置开机启动kubelet服务
systemctl enable kubelet

3.2、加入集群

kubeadm join 192.168.2.9:6443 --token dli7gh.dclgtwobuj6udsfq \
    --discovery-token-ca-cert-hash sha256:04cb3862ef9f49d891b0d0555e19d01ad67eac2467980d34f7726956705b25ad

如果忘记,可在k8s-master节点上执行kubeadm token create --print-join-command命令来获取。

在k8s-master上查看k8s节点信息:

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   19h   v1.16.7
k8s-node1    Ready    <none>   18h   v1.16.7

4、安装Dashboard

k8s Dashboard是一个基于Web用户界面,用来管理k8s集群,并可展示集群的状态。k8s集群安装好后默认没有包含Dashboard,此处在k8s-master节点安装Dashboard。

4.1、下载Dashboard的yaml文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

4.2、配置recommended.yaml

添加NodePort,端口为30001,如下所示:

---

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

---

删除以下部分:

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

---

4.3、创建用户admin-user

新建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

4.4、生成证书

正常安装部署完Kubernetes Dashboard后,通过Chrome浏览器不能访问,通常是由于部署Kubernetes Dashboard时生成的证书日期有问题,解决办法,可以通过自签证书的形式解决。

下面是生成 k8s dashboard 域名证书方法,任何一种都可以:

  • 通过 https://freessl.cn 网站,在线生成免费1年的证书
  • 通过 Let’s Encrypt 生成 90天 免费证书
  • 通过 Cert-Manager 服务来生成和管理证书

我们这里没有域名,仅仅是通过ip访问测试,所以就通过openssl工具自签一个证书用于测试。

#生成证书key

openssl genrsa -out dashboard.key 2048

#生成证书csr,ip可为集群任意节点ip,此处设置为k8s-master节点ip

openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.2.9'

#生成自签证书(证书默认过期时间365天,此处设置为3650天)

openssl x509 -days 3650 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt

4.5、部署Dashboard

#部署dashboard
kubectl apply -f  recommended.yaml
#创建用户
kubectl apply -f  admin.yaml

查看服务状态

[root@k8s-master /]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.105.35.200    <none>        8000/TCP        18h
kubernetes-dashboard        NodePort    10.109.159.254   <none>        443:30001/TCP   18h

4.6、创建dashboard的secret

kubectl create secret generic kubernetes-dashboard-certs -n kubernetes-dashboard --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key

4.7、获取admin-user登录token

[root@k8s-master home]# kubectl describe secrets -n kubernetes-dashboard admin-user
Name:         admin-user-token-kj95x
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: ac20a965-4db2-4fc6-aa89-408187912e88

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlIxTndJTEppT1MzT1c4Y0pBNHRvdkRhYnhPMDY0dFljdE5yU1pWY3o5Ym8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWtqOTV4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhYzIwYTk2NS00ZGIyLTRmYzYtYWE4OS00MDgxODc5MTJlODgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.blHlzuPpXhCOU5Akys-IOenPsCMZ1sBBngmC2-yi4XzsSVkgY9cO79iZtaIyKTnDoEQuqnnhTfHh47-AZ44xqAEPiMmNUaFehhsqeZfWIcjwecpY0DhqgBwOUrzFwOucTZgkn7FknnZknKZ58AYHBsf0T7GLYz_i2SSURnis7hSWqtjsrY1AzQA4K79pT1VlMb3Q2pr6UujIwyAeQdv4VSHaaDuU_Qd37_4FERMYI2RgIho9XdwQuqxEgMzgcMLdqkhp53LDw384lRHHkmYS85AqKtjLicmejnpp6Wk_BUR475oW1o1lDavA5ZnNf948VkgbZDLC835gC1-jCIMDww

在chrome浏览器输入https://192.168.2.9:30001,打开k8s集群Dashboard,如下图所示:

Logo

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

更多推荐