来源:https://lcylichenyi.github.io/kubernete/
0.搭建环境
镜像:ubuntu-18.04.3-live-server-amd64
身份:root(重要)
(有使用http代理和不代理两种选项,都可以走通,已测试)
1.设置http代理【如不使用代理可跳过这一步】:
1.1 curl代理配置
vi ~/.curlrc
# 加一行 proxy=http://xxx.xxx.xxx.xxx:xx
# 然后curl 谷歌看是否正常
1.2 docker代理配置
mkdir /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
## 复制下面内容
[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xx" "HTTPS_PROXY=http://xxx.xxx.xxx.xxx:xx"
##
systemctl daemon-reload && systemctl restart docker
2.设置apt代理【如使用阿里云服务器可跳过这一步】
使用阿里云的镜像:
(https://developer.aliyun.com/mirror)[https://developer.aliyun.com/mirror]
使用以下代码替换/etc/apt/sources.list的内容,替换前先备份(mv sources.list sources.list.bak)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
然后重启
3.安装docker
官网下载教程:
https://docs.docker.com/install/linux/docker-ce/ubuntu/
(以下代码保存为shell直接运行更快)
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 成功后看是否成功
docker --version
# 然后设置开机自动启动docker
sudo systemctl enable docker
4 禁用swap
对于禁用swap内存,具体原因可以查看Github上的Issue:Kubelet/Kubernetes should work with Swap Enabled
https://github.com/kubernetes/kubernetes/issues/53533
若想永久关闭:
-
sudo vim /etc/fstab
注释掉swap那一行
-
重启
5.安装kubelet & kubeadm & kubectl
kubelet:运行在cluster所有节点上,负责启动POD和容器
kubeadm:用于初始化cluster
kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件(node节点其实可以不用安装)
5.1 使用代理
方案一(官方,配置过代理推荐使用这个)
来源:
https://kubernetes.io/docs/tasks/tools/install-kubectl
(以下代码保存为shell直接运行更快)
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl kubeadm kubelet
apt-mark hold kubelet kubeadm kubectl
查看状态
systemctl status kubelet
开机自启动
systemctl enable kubelet
5.2 不使用代理
方案二(如果没有使用代理):
来源:
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.53322f70H0yumO
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 生成/etc/apt/sources.list.d/kubernetes.list文件加上一行即可
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
查看状态
systemctl status kubelet
开机自启动
systemctl enable kubelet
6 获取kubeadm启动需要的镜像
方法一(使用了代理):
如能翻墙则直接kubeadm config images pull
方法二(没有使用代理):
运行
kubeadm config images list
获取当前版本kubeadm启动需要的镜像,像这样
k8s.gcr.io/kube-apiserver:v1.17.0
k8s.gcr.io/kube-controller-manager:v1.17.0
k8s.gcr.io/kube-scheduler:v1.17.0
k8s.gcr.io/kube-proxy:v1.17.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
然后把前缀k8s.gcr.io/ 去掉 写个像下面这样的shell脚本运行一下,用阿里云的镜像替代谷歌的镜像。
#!/bin/bash
images=(
kube-apiserver:v1.17.0
kube-controller-manager:v1.17.0
kube-scheduler:v1.17.0
kube-proxy:v1.17.0
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for i in ${images[@]};
do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$i
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$i k8s.gcr.io/$i
done
7 修改docker的cgroup驱动程序
只能使用“systemd" 不然会报错
vi /etc/docker/daemon.json
加一条
"exec-opts":["native.cgroupdriver=systemd"]
随后
systemctl restart docker
8 直接克隆机器形成几个节点(省事)
此时可以直接克隆一下形成几个节点,因为此时的状态可以直接当作节点使用。
如果是虚拟机中布置 在当前状态直接克隆形成几个节点改一下hostname和ip地址即可,可以省很多事。
如果是虚拟机的话 克隆之后修改一下节点的ip(在ip许可范围内的都行,最简单的就在原来的ip上加1)
因为我这里是ens33 这里也可能是eth0
# 修改ip地址
sudo ifconfig ens33 <新的ip地址>
sudo systemctl restart network-manager
# 修改主机名(改成啥样随意)
vi /etc/hostname
# 重启
reboot
9 启动(只在master节点)
ip地址用ip addr看本机的ip地址
kubernetes-version 就是前面kubeadm config images 看到的版本号,我这里是v1.17.0
sudo kubeadm init --kubernetes-version=v1.17.0 --apiserver-advertise-address=<本机的ip地址>
如图:init成功 ,以下图仔细看,token和ip地址要记住(如果忘了也没事)
# 可以查看其他node join master时需要的token
kubeadm token create --print-join-command
验证是否启动成功:
curl https://127.0.0.1:6443 -k
正常结果:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
"reason": "Forbidden",
"details": {
},
"code": 403
}
随后
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
10 加入(node节点)
# 在master上查看需要在node上运行的命令
kubeadm token create --print-join-command
# 在node上运行类似这种(不要复制黏贴 用上面查看获得的)
kubeadm join 192.168.190.77:6443 --token zvj7eq.l5eenxi8ofhk3kxd \
--discovery-token-ca-cert-hash sha256:49ceaed93cd973f6cd276cb036bd95333f4a70d7a6a588580b399fa3108002c4
11 检验(在master节点上)
kubectl get nodes
这时可以看到3个NotReady的节点。 这是因为还没安装网络插件。
12 安装网络插件
来源:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
选择weave net
sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
然后等待
kubectl get pods --all-namespaces
全是running即可
注:不加–all-namespaces则默认指明namespace=default 所以看不到
13 修改nodeport端口范围
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 增加一行--service-node-port-range=1-65535
# (修改完自动会更新,不需要其他操作)
默认值为30000-32767,如果不修改的话使用ingress时对外暴露的接口80与443会随机使用另外两个范围内的值。
14 安装ingress control
来源:
https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/installation.md
kubectl apply -f common/ns-and-sa.yaml
kubectl apply -f common/default-server-secret.yaml
kubectl apply -f common/nginx-config.yaml
kubectl apply -f common/custom-resource-definitions.yaml
kubectl apply -f rbac/rbac.yaml
kubectl apply -f daemon-set/nginx-ingress.yaml
# 然后在nodeport.yaml文件中增加两个nodePort字段强制指向主机的80和443端口,而不是使用随机分配的端口
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress
namespace: nginx-ingress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
nodePort: 80 #新增
- port: 443
targetPort: 443
protocol: TCP
name: https
nodePort: 443 #新增
selector:
app: nginx-ingress
kubectl apply -f service/nodeport.yaml
dePort字段强制指向主机的80和443端口,而不是使用随机分配的端口
```yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress
namespace: nginx-ingress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
nodePort: 80 #新增
- port: 443
targetPort: 443
protocol: TCP
name: https
nodePort: 443 #新增
selector:
app: nginx-ingress
kubectl apply -f service/nodeport.yaml