1 服务器虚拟机准备
IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|
192.168.200.21 | master and etcd | >=2c | >=2G | master |
192.168.200.22 | worker | >=2c | >=2G | node1 |
192.168.200.23 | worker | >=2c | >=2G | node2 |
注意:hostname不能有大写字母,比如Master这样。
2 软件版本
系统类型 | Kubernetes版本 | docker版本 | kubeadm版本 | kubectl版本 | kubelet版本 |
---|---|---|---|---|---|
CentOS7.5.1804 | v1.17.4 | 19.03.8-ce | v1.17 | v1.17.4 | v1.17.4 |
注意:这里采用的软件版本,请大家严格保持一致! 开源软件,版本非常敏感和重要!
Kubernetes 版本查阅地址:https://github.com/kubernetes/kubernetes/releases
3 服务器环境初始化操作
3.1 配置hostname
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
每台机器上设置对应好hostname,注意,不能有大写字母
3.2 配置/etc/hosts
注意hosts文件非常重要,请在每个节点上执行
192.168.200.21 master
192.168.200.22 node01
192.168.200.23 node02
3.3 关闭防火墙、selinux、swap
3.3.1 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3.3.2 关闭Selinux
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
3.3.3 关闭Swap
swapoff –a
sed -i 's/.*swap.*/#&/' /etc/fstab
3.3.4 加载br_netfilter
modprobe br_netfilter
3.4 配置内核参数
3.4.1 配置sysctl内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
3.4.2 生效配置文件
sysctl -p /etc/sysctl.d/k8s.conf
3.4.3 调高ulimit最大打开数和systemctl管理的服务文件最大打开数
echo "* soft nofile 655360" >> /etc/security/limits.conf
echo "* hard nofile 655360" >> /etc/security/limits.conf
echo "* soft nproc 655360" >> /etc/security/limits.conf
echo "* hard nproc 655360" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
echo "DefaultLimitNOFILE=1024000" >> /etc/systemd/system.conf
echo "DefaultLimitNPROC=1024000" >> /etc/systemd/system.conf
3.5 配置CentOS YUM源等
3.5.1 配置国内yum源地址、epel源地址
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache
3.5.2 配置国内Kubernetes源地址
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
3.6 安装依赖软件包
有些依赖包我们要把它安装上,方便到时候使用
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp bash-completion yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools vim libtool-ltdl
3.6.1 时间同步配置
Kubernetes是分布式的,各个节点系统时间需要同步对应上。
yum install chrony –y
systemctl enable chronyd.service && systemctl start chronyd.service && systemctl status chronyd.service
chronyc sources
运行date命令看下系统时间,过一会儿时间就会同步。
3.6.2 配置master到node节点间ssh互信
配置ssh互信,那么节点之间就能无密访问,方便日后执行自动化部署
ssh-keygen
#一路回车...
ssh-copy-id node1
ssh-copy-id node2
3.6.3 初始化环境配置检查
- 重启,做完以上所有操作,最好reboot重启一遍
- ping 每个节点hostname 看是否能ping通
- ssh 对方hostname看互信是否无密码访问成功
- 执行date命令查看每个节点时间是否正确
- 执行 ulimit -Hn 看下最大文件打开数是否是655360
- cat /etc/sysconfig/selinux |grep disabled 查看下每个节点selinux是否都是disabled状态
4 Dcoker安装
4.1 卸载旧版本docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4.2 设置国内docker yum源
wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.3 设置存储库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4.4 列出docker版本
yum list docker-ce --showduplicates | sort -r
4.5 安装docker 指定19.03.8版本
sudo yum install docker-ce-19.03.8-3.el7 docker-ce-cli-19.03.8-3.el7 containerd.io
4.6 配置加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://xad6i9zy.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-opts": {
"max-size": "500m",
"max-file": "3"
}
}
EOF
从上到下包含了镜像下载加速器、k8s初始化警告(detected “cgroupfs” as the Docker cgroup driver)、日志切割
4.7 启动Docker
systemctl enable docker;systemctl start docker;systemctl status docker
5 安装kubeadm、kubelet、kubectl
5.1 工具说明
• kubeadm: 部署集群用的命令
• kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
• kubectl: 集群管理工具
5.2 yum 安装工具
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
5.3 启动kubelet
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
注意:kubelet 服务会暂时启动不了,先不用管它。
6 Kubernetes部署
6.1 部署master节点
6.1.1 初始化
kubeadm init --kubernetes-version=1.17.4 \
--apiserver-advertise-address=192.168.200.21 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
- —apiserver-advertise-address 地址就是master本机IP地址
- —image-repository 指定镜像仓库
- —pod-network-cidr 定义POD的网段为: 10.244.0.0/16
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址,很多初次部署的同学都卡在此环节无法进行后续配置,所以借助image-repository参数,即可正常下载国外镜像,稍微等一下就能看成功信息(下载也是需要时间滴)。
集群初始化成功后返回如下信息:
.....
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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.200.21:6443 --token esy478.u640ppo7klk0tug3 \
--discovery-token-ca-cert-hash sha256:4095864515bf4a23ec1256d7356d48fa23e77a2582e9639329d56fbab0fc5766
记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行
6.2 新增节点
init生成的token24小时后会失效,后期新增需要重新创建token
kubeadm join 192.168.200.21:6443 --token esy478.u640ppo7klk0tug3 \
--discovery-token-ca-cert-hash sha256:4095864515bf4a23ec1256d7356d48fa23e77a2582e9639329d56fbab0fc5766
该章节参考命令:
- kubeadm token list 查看token
- kubeadm token create 重新生成新的token
6.3 验证测试
6.3.1 配置kubectl命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.3.2 执行获取pods列表命令,查看相关状态
kubectl get pods --all-namespaces
其中coredns pod处于Pending状态,这个先不管。
我们也可以执行 kubectl get cs 查看集群的健康状态:
查看节点状态
6.4 部署网络
不部署网络节点状态为NotReady
6.4.1 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
至此,Master 节点初始化完毕,查看集群相关信息:
# 查看集群信息
$ kubectl cluster-info
Kubernetes master is running at https://192.168.200.21:6443
KubeDNS is running at https://192.168.200.21:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
# 查看节点信息
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
cfdemo1 Ready master 34m v1.17.4
cfdemo2 Ready <none> 31m v1.17.4
cfdemo3 Ready <none> 31m v1.17.4
# 查看 Pods 信息
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-9d85f5447-f8fk6 1/1 Running 0 34m
kube-system coredns-9d85f5447-rzsb5 0/1 Running 0 34m
kube-system etcd-cfdemo1 1/1 Running 0 34m
kube-system kube-apiserver-cfdemo1 1/1 Running 0 34m
kube-system kube-controller-manager-cfdemo1 1/1 Running 0 34m
kube-system kube-flannel-ds-amd64-7rq5m 1/1 Running 0 6m
kube-system kube-flannel-ds-amd64-lz4pk 1/1 Running 0 6m
kube-system kube-flannel-ds-amd64-ww4wg 1/1 Running 0 6m
kube-system kube-proxy-bfngd 1/1 Running 0 34m
kube-system kube-proxy-bvd54 1/1 Running 0 31m
kube-system kube-proxy-cqbmd 1/1 Running 0 31m
kube-system kube-scheduler-cfdemo1 1/1 Running 0 34m
6.5 创建Pod验证集群是否正常
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
6.6 重置初始化
如果初始化过程出现问题,使用如下命令重置:
kubeadm reset
rm -rf /var/lib/cni/
rm -f $HOME/.kube/config
7 部署Dashboard
部署dashboard之前,我们需要生成证书,不然后面会https访问登录不了。
Kubernetes集群基于Web的通用UI。它允许用户管理集群中运行的应用程序并对其进行故障排除,以及管理集群本身。
7.1 生成私钥和证书签名请求
#创建单独命名空间
$ kubectl create namespace kubernetes-dashboard
#创建私钥目录
$ mkdir $HOME/certs && cd $HOME/certs
#生成私钥
openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
rm -rf dashboard.pass.key
#生成csr证书签名请求
openssl req -new -key dashboard.key -out dashboard.csr
#生成自签名的ssl证书
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
7.2 创建 ssl 证书 secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kubernetes-dashboard
7.2.1 describe secrets
kubectl describe secrets -n kubernetes-dashboard kubernetes-dashboard-certs
7.3 修改yaml
7.3.1 配置私有证书
注释掉原有证书,启用私有证书
containers:
- args:
- --tls-cert-file=/dashboard.crt
- --tls-key-file=/dashboard.key
- --token-ttl=3600
7.3.2 添加暴露端口
7.4 部署 k8s dashboard
kubectl apply -f recommended.yaml
7.4.1 查看状态
Dashboard地址:https://$IP:30001
kubectl get pods -n kubernetes-dashboard
kubectl get svc --all-namespaces -o wide
7.4.2 创建登陆用户
创建 admin-user
管理员 yaml 配置
cat > create-admin.yaml <<EOF
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
EOF
7.4.3 创建用户
$ kubectl apply -f create-admin.yaml
7.4.4 获取token
$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')