步骤
一、Docker安装;
二、k8s安装准备工作;
三、Master节点安装;
四、Node节点安装;
五、Dashboard安装;
六、集群测试。
环境说明:
172.27.9.131 master
172.27.9.135 node01
172.27.9.136 node02
一、Docker安装
所有节点都需要安装docker
- 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 - 设置Docker源
yum-config-manager --add-repo download.docker.com/linux/cento…
- 在使用yum命令安装指定版本docker时报如下错误:
GPG key retrieval failed: [Errno 12] Timeout on download.docker.com/
原因分析:这是由于国内访问不到docker官方镜像的缘故
解决办法:
yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
- 安装Docker CE
3.1 docker安装版本查看
yum list docker-ce --showduplicates | sort -r
3.2 安装docker
yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
- 不指定版本安装: yum install -y docker-ce docker-ce-cli containerd.io
- 启动Docker
systemctl start docker
systemctl enable docker - 命令补全
5.1 安装bash-completion
yum -y install bash-completion
5.2 加载bash-completion
source /etc/profile.d/bash_completion.sh - 镜像加速
由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置为例。
6.1 登陆阿里云容器模块
登陆地址为:cr.console.aliyun.com ,未注册的可以先注册阿里云账户
6.2 配置镜像加速器
配置daemon.json文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tvgm2f32.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 验证
docker --version
docker run hello-world
通过查询docker版本和运行容器hello-world来验证docker是否安装成功。
二、k8s安装准备工作
安装Centos是已经禁用了防火墙和selinux并设置了阿里源。master和node节点都执行本部分操作。
查看防火墙状态:firewall-cmd --state
- 配置主机名
1.1 修改主机名
hostnamectl set-hostname master
more /etc/hostname
退出重新登陆即可显示新设置的主机名master
1.2 修改hosts文件
cat >> /etc/hosts << EOF
172.27.9.131 master
172.27.9.135 node01
172.27.9.136 node02
EOF
more /etc/hosts
2. 验证mac地址uuid
cat /sys/class/net/eth0/address
cat /sys/class/dmi/id/product_uuid
保证各节点mac和uuid唯一
3. 禁用swap
3.1 临时禁用
swapoff -a
3.2 永久禁用
若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap
sed -i.bak '/swap/s/^/#/' /etc/fstab
4. 内核参数修改
4.1 临时修改
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
4.2 永久修改
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
5. 修改Cgroup Driver
5.1 修改daemon.json
修改daemon.json,新增‘"exec-opts": ["native.cgroupdriver=systemd"]’
more /etc/docker/daemon.json
{
"registry-mirrors": ["v16stybc.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
5.2 重新加载docker
systemctl daemon-reload
systemctl restart docker
6. 设置kubernetes源
6.1 新增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
- [] 中括号中的是repository id,唯一,用来标识不同仓库
- name 仓库名称,自定义
- baseurl 仓库地址
- enable 是否启用该仓库,默认为1表示启用
- gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
- repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
- gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
6.2 更新缓存
yum clean all
yum -y makecache
三、Master节点安装
- 版本查看
yum list kubelet --showduplicates | sort -r - 安装kubelet、kubeadm和kubectl
2.1 安装三个包
yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2
若不指定版本直接运行‘yum install -y kubelet kubeadm kubectl’则默认安装最新版
2.2 安装包说明
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.3 启动kubelet
启动kubelet并设置开机启动
systemctl enable kubelet && systemctl start kubelet
2.4 kubelet命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile - 下载镜像
3.1 镜像下载的脚本
Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。
more image.sh
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.18.2
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 下载镜像
运行脚本image.sh,下载指定版本的镜像
./image.sh
docker images
4. 初始化Master
4.1 初始化
kubeadm init \
--apiserver-advertise-address=172.27.9.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案。
记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中。
4.2 加载环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
本文所有操作都在root用户下执行,若为非root用户,则执行如下操作:
mkdir -p HOME/.kube/config
chown (id -g) $HOME/.kube/config
5. 安装pod网络
kubectl apply -f raw.githubusercontent.com/coreos/flan…
6. master节点配置
taint:污点的意思。如果一个节点被打上了污点,那么pod是不允许运行在这个节点上面的
6.1 删除master节点默认污点
默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作:
查看污点:
kubectl describe node master|grep -i taints
Taints: node-role.kubernetes.io/master:NoSchedule
删除默认污点: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@master ~]# kubectl taint node master key1=value1:NoSchedule node/master tainted [root@master ~]# kubectl describe node master|grep -i taints Taints: key1=value1:NoSchedule key为key1,value为value1(value可以为空),effect为NoSchedule表示一定不能被调度
删除污点:
[root@master ~]# kubectl taint nodes master key1-
node/master untainted
[root@master ~]# kubectl describe node master|grep -i taints
Taints:
删除指定key所有的effect,‘-’表示移除所有以key1为键的污点
四、Node节点安装
- 安装kubelet、kubeadm和kubectl
同master节点 - 下载镜像
同master节点 - 加入集群
以下操作master上执行
3.1 查看令牌
kubeadm token list
3.2 生成新的令牌
kubeadm token create
3.3 生成新的加密串 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |
openssl dgst -sha256 -hex | sed 's/^.* //'
3.4 node节点加入集群
在node节点上分别执行如下操作(步骤4.1中记录kubeadm join的输出):
kubeadm join 172.27.9.131:6443 --token 1zl3he.fxgz2pvxa3qkwxln --discovery-token-ca-cert-hash sha256:5f656ae26b5e7d4641a979cbfdffeb7845cc5962bbfcd1d5435f00a25c02ea50
五、Dashboard安装
- 下载yaml文件手动修改service部分
wget raw.githubusercontent.com/kubernetes/… - 修改yaml文件
2.1 vim recommended.yaml
2.2 修改Service部分
-----------------------------------------------
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard
----------------------------------------------
注意如果这里的nodePort写成nodeport或者存在其他书写问题,就会报错
不能用tab缩进,冒号后有空格
3. 更新配置
kubectl apply -f recommended.yaml
状态查看 kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system -o wide
kubectl get services -n kube-system
4. 登录dashboard
浏览器访问dashboard:
https://<any_node_ip>:30443
5. Token认证方式登录
5.1 创建dashboard-adminuser.yaml:
cat > dashboard-adminuser.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
5.2 创建登录用户
kubectl apply -f dashboard-adminuser.yaml
- 说明:上面创建了一个叫admin-user的服务账号,并放在kubernetes-dashboard命名空间下,并将cluster-admin角色绑定到admin-user账户,这样admin-user账户就有了管理员的权限。默认情况下,kubeadm创建集群时已经创建了cluster-admin角色,我们直接绑定即可。
5.3 查看admin-user账户的token
kubectl -n kubernetes-dashboard describe secret (kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print 1}')
把获取到的Token复制到登录界面的Token输入框中,登陆成功。
六、集群测试
问题汇总
kubeadm安装k8s 组件controller-manager 和scheduler状态 Unhealthy
通过kubeadm安装好kubernetes v1.18.6 查看集群状态,发现组件controller-manager 和scheduler状态 Unhealthy
检查端口未监听
组件运行正常
检查kube-scheduler和kube-controller-manager组件配置是否禁用了非安全端口
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
将port=0去掉
然后systemctl restart kubelet
再检查集群组件状态已正常
转载地址:www.gjie.cn/2618.html