fix #687
parent
bd151db6d3
commit
6b65938dbc
|
|
@ -261,6 +261,7 @@ func TestSetup(t *testing.T) {
|
||||||
|
|
||||||
var expectedConfig = `k9s:
|
var expectedConfig = `k9s:
|
||||||
refreshRate: 100
|
refreshRate: 100
|
||||||
|
dockerShellImage: busybox:1.31
|
||||||
headless: false
|
headless: false
|
||||||
readOnly: true
|
readOnly: true
|
||||||
noIcons: false
|
noIcons: false
|
||||||
|
|
@ -320,6 +321,7 @@ var expectedConfig = `k9s:
|
||||||
|
|
||||||
var resetConfig = `k9s:
|
var resetConfig = `k9s:
|
||||||
refreshRate: 2
|
refreshRate: 2
|
||||||
|
dockerShellImage: busybox:1.31
|
||||||
headless: false
|
headless: false
|
||||||
readOnly: false
|
readOnly: false
|
||||||
noIcons: false
|
noIcons: false
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,16 @@ package config
|
||||||
|
|
||||||
import "github.com/derailed/k9s/internal/client"
|
import "github.com/derailed/k9s/internal/client"
|
||||||
|
|
||||||
const defaultRefreshRate = 2
|
const (
|
||||||
|
defaultRefreshRate = 2
|
||||||
|
// DefaultDockerShellImage specifies the docker image and tag for shelling into nodes.
|
||||||
|
DefaultDockerShellImage = "busybox:1.31"
|
||||||
|
)
|
||||||
|
|
||||||
// K9s tracks K9s configuration options.
|
// K9s tracks K9s configuration options.
|
||||||
type K9s struct {
|
type K9s struct {
|
||||||
RefreshRate int `yaml:"refreshRate"`
|
RefreshRate int `yaml:"refreshRate"`
|
||||||
|
DockerShellImage string `yaml:"dockerShellImage"`
|
||||||
Headless bool `yaml:"headless"`
|
Headless bool `yaml:"headless"`
|
||||||
ReadOnly bool `yaml:"readOnly"`
|
ReadOnly bool `yaml:"readOnly"`
|
||||||
NoIcons bool `yaml:"noIcons"`
|
NoIcons bool `yaml:"noIcons"`
|
||||||
|
|
@ -24,10 +29,11 @@ type K9s struct {
|
||||||
// NewK9s create a new K9s configuration.
|
// NewK9s create a new K9s configuration.
|
||||||
func NewK9s() *K9s {
|
func NewK9s() *K9s {
|
||||||
return &K9s{
|
return &K9s{
|
||||||
RefreshRate: defaultRefreshRate,
|
RefreshRate: defaultRefreshRate,
|
||||||
Logger: NewLogger(),
|
DockerShellImage: DefaultDockerShellImage,
|
||||||
Clusters: make(map[string]*Cluster),
|
Logger: NewLogger(),
|
||||||
Thresholds: NewThreshold(),
|
Clusters: make(map[string]*Cluster),
|
||||||
|
Thresholds: NewThreshold(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -98,6 +104,9 @@ func (k *K9s) validateDefaults() {
|
||||||
if k.RefreshRate <= 0 {
|
if k.RefreshRate <= 0 {
|
||||||
k.RefreshRate = defaultRefreshRate
|
k.RefreshRate = defaultRefreshRate
|
||||||
}
|
}
|
||||||
|
if k.DockerShellImage == "" {
|
||||||
|
k.DockerShellImage = DefaultDockerShellImage
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *K9s) validateClusters(c client.Connection, ks KubeSettings) {
|
func (k *K9s) validateClusters(c client.Connection, ks KubeSettings) {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/derailed/k9s/internal/client"
|
"github.com/derailed/k9s/internal/client"
|
||||||
|
"github.com/derailed/k9s/internal/config"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
kerrors "k8s.io/apimachinery/pkg/api/errors"
|
kerrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
|
@ -139,7 +140,7 @@ func ssh(a *App, node string) error {
|
||||||
if err := launchShellPod(a, node); err != nil {
|
if err := launchShellPod(a, node); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
shellIn(a, client.FQN(k9sShellNS, k9sShell), k9sShell)
|
shellIn(a, client.FQN(k9sShellNS, k9sShellPodName()), k9sShell)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -148,7 +149,7 @@ func nukeK9sShell(c client.Connection) {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
err := c.DialOrDie().CoreV1().Pods(k9sShellNS).Delete(ctx, k9sShell, metav1.DeleteOptions{})
|
err := c.DialOrDie().CoreV1().Pods(k9sShellNS).Delete(ctx, k9sShellPodName(), metav1.DeleteOptions{})
|
||||||
if kerrors.IsNotFound(err) {
|
if kerrors.IsNotFound(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -158,7 +159,11 @@ func nukeK9sShell(c client.Connection) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func launchShellPod(a *App, node string) error {
|
func launchShellPod(a *App, node string) error {
|
||||||
spec := k9sShellPod(node)
|
img := a.Config.K9s.DockerShellImage
|
||||||
|
if img == "" {
|
||||||
|
img = config.DefaultDockerShellImage
|
||||||
|
}
|
||||||
|
spec := k9sShellPod(node, img)
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
dial := a.Conn().DialOrDie().CoreV1().Pods(k9sShellNS)
|
dial := a.Conn().DialOrDie().CoreV1().Pods(k9sShellNS)
|
||||||
|
|
@ -167,7 +172,7 @@ func launchShellPod(a *App, node string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < k9sShellRetryCount; i++ {
|
for i := 0; i < k9sShellRetryCount; i++ {
|
||||||
o, err := a.factory.Get("v1/pods", client.FQN(k9sShellNS, k9sShell), true, labels.Everything())
|
o, err := a.factory.Get("v1/pods", client.FQN(k9sShellNS, k9sShellPodName()), true, labels.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
time.Sleep(k9sShellRetryDelay)
|
time.Sleep(k9sShellRetryDelay)
|
||||||
continue
|
continue
|
||||||
|
|
@ -185,13 +190,17 @@ func launchShellPod(a *App, node string) error {
|
||||||
return fmt.Errorf("Unable to launch shell pod on node %s", node)
|
return fmt.Errorf("Unable to launch shell pod on node %s", node)
|
||||||
}
|
}
|
||||||
|
|
||||||
func k9sShellPod(node string) v1.Pod {
|
func k9sShellPodName() string {
|
||||||
|
return fmt.Sprintf("%s-%d", k9sShell, os.Getpid())
|
||||||
|
}
|
||||||
|
|
||||||
|
func k9sShellPod(node, image string) v1.Pod {
|
||||||
var grace int64
|
var grace int64
|
||||||
var priv bool = true
|
var priv bool = true
|
||||||
|
|
||||||
return v1.Pod{
|
return v1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: k9sShell,
|
Name: k9sShellPodName(),
|
||||||
Namespace: k9sShellNS,
|
Namespace: k9sShellNS,
|
||||||
},
|
},
|
||||||
Spec: v1.PodSpec{
|
Spec: v1.PodSpec{
|
||||||
|
|
@ -213,7 +222,7 @@ func k9sShellPod(node string) v1.Pod {
|
||||||
Containers: []v1.Container{
|
Containers: []v1.Container{
|
||||||
{
|
{
|
||||||
Name: k9sShell,
|
Name: k9sShell,
|
||||||
Image: "busybox:1.31",
|
Image: image,
|
||||||
VolumeMounts: []v1.VolumeMount{
|
VolumeMounts: []v1.VolumeMount{
|
||||||
{
|
{
|
||||||
Name: "root-vol",
|
Name: "root-vol",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue